一篇读懂Mysql索引

604 阅读4分钟

索引介绍

索引是个什么东西

官方介绍:帮助mysql高效获取数据的数据结构。简单说,数据库的索引就跟书的目录是一个东西,能够 帮助我们更快的找到我们想要的东西,提高数据库的查询速度。

索引的优劣势

索引的优势

  • 检索:索引可以提高数据库的查询效率,降低查询的IO成本。
  • 排序:通过索引列对数据库进行排序,可以降低CPU的消耗.
    • 被检索的索引会进行自动排序,包括单列索引和组合索引,组合索引的排序会更复杂
    • 如果按照索引列的顺序进行排序,就是order by,效率就会提升较多
    • where索引列会在存储引擎层进行处理,也就是索引下推

索引的劣势

  • 索引会占据磁盘空间
  • 索引可以提高查询效率,但是会降低更新表的效率,就是增删改,因为MYSQL不仅需要保持数据,同时需要更新对应的索引文件。

索引的分类

  • 主键索引:根据表的主键mysql自动创建的索引,不允许重复,也不允许null
  • 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引
  • 唯一索引:索引列的值必须唯一,但允许有空值
  • 组合索引:多个列组合成的索引
  • 全文索引:将整个文本形成索引,mysql中只有MyIASM和Innodb支持

索引的原理分析

索引的存储结构

索引是由存储引擎实现的,因此不同的存储引擎会使用不同的索引。MyISAM和Innodb默认的索引是B+Tree。Memory支持HASH和BTree。

B树和B+树

这里给大家推荐一个数据结构的演示网站,个人觉得挺好的 www.cs.usfca.edu/~galles/vis…

  • B树

  • B+Tree

从上面B数的图可以看出来,B树是多叉的平衡树,内节点可以有多个分叉.B树的高度一般是2-4层,树的高度会对IO读写的次数造成直接的影响,4层的树结构可以支撑的数据可以达到几个个T

两者区别

二者的主要区别就是在于非叶子节点是否存储数据.B树的叶子节点和非叶子节点都会存储数据。而B+树只有叶子节点才会存储数据,而且存储的数据都是在一行上,而且从图中可以看出来是有序的,形成一个单向的链表。

非聚集索引(MyISAM)

主键索引和辅助索引

在MyISAM中主键索引和辅助索引的结构是一样的,在MyISAM中索引文件和数据是分开的因此称为非聚集索引.MyISAM中B+Tree的叶子节点存是数据是具体数据的指针值。查询的时候,通过索引树找到对应的节点,通过索引节点中存储的记录指针找到数据文件中对应的记录。上图中的索引树就存在之前说的索引文件(myi)中,具体的数据存储在数据文件(myd)中。

聚集索引(Innodb)

Innodb使用的是聚集索引,索引和数据都存在ibd文件中,看下具体的存储结构。

主键索引

我们可以看到Innodb中主键索引B+Tree的叶子节点直接挂载所有的数据,通过主键查询的时候可以直接找到所有的数据。

辅助索引

辅助索引中叶子节点挂载的数据实际上是主键id,也就是如果查询的时候如果使用的不是主键索引,查询的字段也不是对应的索引列就会进行回表,也就是说先查询辅助索引树找到对应节点下的主键id,再通过这个主键id到主键索引树中找对对应的索引节点,查找到该节点下挂载的数据。对于这种情况,我们可以用覆盖索引避免回表,也就是把要查询的字段设置成组合索引一起查出来。