常见的索引类型
索引类型,非MySQL独有
1.hash索引【HashMap】
2.有序数组索引
3.跳表索引【redis-zset|zookeeper】
4.二叉树索引【Mysql B+树】
聚簇索引
主键索引的叶子节点存的整行数据。在InnoDB中主键索引也被称为聚簇索引。
非聚簇索引
非主键索引的叶子节点存的是主键的值。在InnoDB中非主键索引也被称为非聚簇索引。
最左匹配原则
当我们创建一个联合索引(key1,key2,key3),相当于创建了三个索引(key1)(key1,key2)(key1,key2,key3),这就是最左匹配原则。
B+树索引
B树的非叶子节点会存储卫星数据(整行数据)
B+树,只有叶子节点会存储卫星数据
B+树优点:
1.单节点可以存储更多元素,使得查询磁盘IO次数减少
2.所有查询都会到达叶子节点,查询性能更稳定
3.所有叶子节点行程有序链表,便于范围查找
PS:在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。
在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
普通索引
唯一索引
主键索引
主键索引就是一种特殊的唯一索引
联合索引
全文索引
FULLTEXT
回表
主键索引(聚簇索引)的叶子节点就是我们要查找的整行数据。
而非主键索引(非聚簇索引)的叶子节点是主键值,还需要再查询一次主键值,找到整行数据,这个过程就叫做回表。
覆盖索引
如果执行的语句是 select ID from T where k between 3 and 5,
这时只需要查 ID 的值,
而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,**不需要回表**。
也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。
explain: Usind index 就说明使用了覆盖索引
索引下推
对于user_table表,我们现在有(username,age)联合索引
如果现在有一个需求,查出名称中以“张”开头且年龄小于等于10的用户信息,
语句C如下:
"select * from user_table where username like '张%' and age > 10".
语句C有两种执行可能:
1、根据(username,age)联合索引查询所有满足名称以“张”开头的索引,然后回表查询出相应的全行数据,然后再筛选出满足年龄小于等于10的用户数据。
2、根据(username,age)联合索引查询所有满足名称以“张”开头的索引,然后直接再筛选出年龄小于等于10的索引,之后再回表查询全行数据。
明显的,第二种方式需要回表查询的全行数据比较少,这就是mysql的索引下推。
mysql默认启用索引下推,我们也可以通过修改系统变量optimizer_switch的index_condition_pushdown标志来控制
SET optimizer_switch = 'index_condition_pushdown=off';
注意点:
1、innodb引擎的表,索引下推只能用于二级索引。
就像之前提到的,innodb的主键索引树叶子结点上保存的是全行数据,所以这个时候索引下推并不会起到减少查询全行数据的效果。
2、索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。
***3、mysql 5.7引入索引下推。通知也会根据,非联合索引做优化,使用索引下推。
注:执行计划中:Using index condition 就是使用了索引下推
假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率
select * from t where a > 2 and b > 10;
网友评论