- 什么是索引
索引是一种数据结构,通常是B-tree、Hash,它存储的是一个表中特定列(一列或多列)的值。它的用途是帮助数据库高效获取数据,快速的找到指定key对应的value或values。其本质就是通过映射来实现的快速查找,从而避免全表扫描。
- B+树是怎么回事
B+树代表的是平衡树而不是二叉树,是MySql常用的索引类型,主要解决如何通过key快速的找到对应的数据,为磁盘或其它存取辅助设备设计的一种平衡查找树。
B+树是由二叉查找树、平稳二叉树、B树演化而来。B+树的高度一般为2到4,有效的减少了查找磁盘的次数。
B+树操作:https://yq.aliyun.com/articles/9280
通过上面文章的介绍可以看出,创建索引是有开销的。B+树为了维持平衡,随着数据的变化(增加、删除),B+树会进行分裂或合并,分裂或合并涉及到磁盘page页的操作,会有一定的开销。
- Hash索引
hash索引由于其结构,所以在每次查询的时候直接一次到位,不像b-tree那样一点点的前进。所以hash索引的效率高于b-tree,但hash也有缺点,主要如下:
(1)由于存放的是hash值,所以仅支持<=>以及in操作.
(2)hash索引无法通过操作索引来排序,这是因为存放的时候经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序.
(3)在组合所以里,无法对部分使用索引.
(4)不能排序
Innodb中使用的自适应hash索引,是由存储引擎来执行,无法干预。
- 聚集索引
聚集索引按照每张表的主键构造一棵B+树,叶子结点中包含了完整的数据记录,叶子结点也可以称之为数据页。聚集索引只能是主键,如果没有主键将找一个不包含null的唯一索引,如果再找不到数据库会自动创建一个隐藏的主键。
- 普通索引(辅助索引)
与聚集索引的区别是叶子结点不包含行记录的数据,除了本身的键值还包含一个书签(bookmark),就是行记录相应的主键。因此通过普通索引查询首先通过叶子结点找到符合记录的结果集,再通过主键索引找到一个完整的行记录。注意这里面不是指向行记录的指针,因为随着数据的变化,B+树会分裂或者合并,叶子结点的位置也会发生变化。
- 最左原则是怎么回事
联合索引是以元组的形式进行排序的,如(cityid,companyid)作为联合主键(索引)时,其叶子层的顺序可能是:(3,157),(3,158),(3,200),(5,34),(5,158),(7,90),可以看到是先按照cityid进行排序,然后再按照companyid排序,对于cityid来说是递增的,而对于companyid是无序的。
最左原则索引应用情况分支:
查询条件 | 索引情况 | |
where cityid = 3 | 应用索引 | |
where companyid = 158 | 不应用索引 | |
where cityid = 3 and companyid = 158 | 应用索引 | |
where companyid = 158 and cityid = 3 | 应用索引 | 执行计划会对此进行优化 |
- 覆盖索引
通过辅助索引就可以得到查询的记录,而不需要查询主键对应的行记录。优点包括:
- 辅助索引不包括整行记录的所有信息,故其大小远小于聚集索引,减少IO操作
- 辅助索引包含了所有信息,不用再通过主键查询行记录,减少IO操作
可以通过explain中的extra选项看出来是否走覆盖索引,如果有using index就是走的覆盖索引
对于上述的联合索引下面几个sql都走覆盖索引
- select cityid,companyid from cc_table
- select cityid,companyid from cc_table where companyid=158
- select count(*) from cc_table where companyid=158
- 执行explain
https://segmentfault.com/a/1190000008131735