索引介绍
索引是个什么东西
官方介绍:帮助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树是多叉的平衡树,内节点能够有多个分叉.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到主键索引树中找对对应的索引节点,查找到该节点下挂载的数据。对于这种状况,咱们能够用覆盖索引避免回表,也就是把要查询的字段设置成组合索引一块儿查出来。