美文网首页程序员
MySQL中的几种索引介绍

MySQL中的几种索引介绍

作者: 不知名的程序员 | 来源:发表于2018-12-29 11:40 被阅读19次

    索引是加快我们查找数据的利器,MySQL中的索引有很多种类型,它们是在存储引擎层实现的,这意味着不同的存储引擎支持的索引类型可能不同,即使相同,底层工作原理也可能不同 (关于存储引擎在在前几天的文章里有介绍),我们这里以索引类型分类,分别介绍一下几种常见的索引。

    B+TREE索引

    这是InnoDB的默认索引类型,我们常听人说MySQL的B-TREE索引,其实MySQL的B树索引就是B+树。学习B+树之前我们先来简单的看下B树。

    B树类似于二叉查找树(关于二叉树,查找树这些基础的这里就不介绍了),能够让查找数据、顺序访问、插入数据及删除的动作,在最差的情况下也都能在对数时间内完成。

    来自维基百科

    上图是一颗简单的B树,可见它与二叉树最大的区别是它允许一个节点有多于2个的元素,每个节点都包含key和数据,查找时我们可以使用二分的方式快速搜索数据。

    我们再来看B+树

    来自维基百科

    可以看到,与B树最大的区别就是每一个叶子结点都包含指向下一个叶子结点的指针,并且叶子结点的指针指向的是被索引的数据,而非其他的节点页,非叶节点仅具有索引作用,跟数据有关的信息均存储在叶节点中,查找时存储引擎通过根节点一层层的进行二分搜索即可。由于B+树在内部节点上不包含数据信息,所以它占用空间更小;叶子节点之间形成链表,从而方便了叶子结点的遍历与范围查找。

    虽然都是B+树索引,但是存储引擎使用它们的方式不同,以我们最常用的俩个引擎为例,在MyISAM中以前缀压缩技术使得索引占用更小并通过数据的物理位置引用被索引的行,而在InnoDB中则按原格式存储并根据主键引用被索引的行。

    HASH索引

    哈希索引基于hash表实现,类似于Java中的HashMap,通过计算key的hash值映射对应的value,在不发生hash冲突的情况下时间复杂度为常数级别,MySQL的hash索引会对所有的索引列计算一个hash码,由于hash的索引的特点,它的缺点也显而易见,只有精确匹配索引所有列的查询才有效,hash索引数据也并不是按照索引值顺序存储的,所以也无无法用于排序,只支持等值查询,不支持范围查询。他是Memory引擎的默认索引类型,也是Memory引擎速度快的原因之一。

    在InnoDB有一个特殊的功能叫做自适应哈希索引,当它发现某些索引值被使用的非常频繁时,它会在内存中基于B+树索引之上再创建一个hash索引,加快数据的查找速度。

    全文索引

    这是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值,全文索引更类似于搜索引擎做的事情,实际生产中我们一般不会使用MySQL来做类似搜索引擎的工作。

    要做搜索的话一般都是使用专业的搜索相关开源工具,从最早的solr到现在的Elasticsearch(主要通过倒排索引,分词等来实现),它们的性能更好,功能也更加强大。

    最后

    了解索引的工作原理之后我们才能更好的使用索引,优化索引,以后有时间再写MySQL常用的索引优化策略。

    相关文章

      网友评论

        本文标题:MySQL中的几种索引介绍

        本文链接:https://www.haomeiwen.com/subject/bezelqtx.html