一篇读懂Mysql索引

索引介绍

索引是个什么东西

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

索引的优劣势

索引的优点

  • 检索:索引能够提升数据库的查询效率,下降查询的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…mysql

  • B树

  • B+Tree

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

二者区别

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

非汇集索引(MyISAM)

主键索引和辅助索引

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

汇集索引(Innodb)

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

主键索引

咱们能够看到Innodb中主键索引B+Tree的叶子节点直接挂载全部的数据,经过主键查询的时候能够直接找到全部的数据。

辅助索引

辅助索引中叶子节点挂载的数据其实是主键id,也就是若是查询的时候若是使用的不是主键索引,查询的字段也不是对应的索引列就会进行回表,也就是说先查询辅助索引树找到对应节点下的主键id,再经过这个主键id到主键索引树中找对对应的索引节点,查找到该节点下挂载的数据。对于这种状况,咱们能够用覆盖索引避免回表,也就是把要查询的字段设置成组合索引一块儿查出来。
相关文章
相关标签/搜索