一、什么是索引
索引是帮助MySQL高效获取数据的排好序的数据结构
索引常用的数据结构:二叉树、红黑树、Hash表、B-Tree,MySQL当前使用的是B+Tree,B+Tree是B-Tree的变种。
B-Tree特性:
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排序
- 索引有可能在非叶子节点结束
- 自动分层控制
B+Tree特性: - 非叶子节点不存储data,只存储索引,可以放更多的索引
- 叶子节点包含所有索引字段,所有查找都在叶子节点结束
- 叶子节点用指针连接、提高区间访问的性能
可以看出,相对于B-Tree:B+树空间利用率更高,因为B+Tree的内部节点只是作为索引使用,而不像B-Tree那样每个节点都需要存储硬盘指针;增删文件(节点)时,效率更高,因为B+Tree的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
实际上,很多时候Hash索引要比B+Tree索引更高效,而且对索引KEY进行一次Hash计算就可以定位出数据存储的位置。那为什么不使用Hash索引?主要是因为Hash索引仅能满足“=”,“IN”,不支持范围查找,而且存在Hash冲突的问题。
二、聚集索引和非聚集索引
聚集索引和非聚集索引都采用了B+Tree的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。
聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。
非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+Tree的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。
MyISAM使用的是非聚集索引,索引文件和数据文件是分离的。
InnoDB使用的是聚集索引,表数据文件本身就是按照B+Tree组织的一个索引结构文件;叶节点包含了完整的数据记录;建议InnoDB表必须建主键,并且推荐使用整型的自增主键;同时为了保持一致性和节省存储空间,非主键索引叶子节点存储的是主键值。
三、索引最左前缀原理
假设建立(a,b,c)联合索引,就会按照a,b,c的顺序对索引文件进行排好序。查询条件为a,b或a,b,c时满足最左前缀原理,可以快速找到索引数据。如果查询条件为a,c或b,c时则会对全表进行扫描。