说下你在使用索引上遇到的一些问题?

索引的出现是为了提高查询效率,但是使用索引也存在一些常见的思维误区:

用索引 和 用索引快速查询 是有区别的,查询SQL经常提到全表扫描效率低,这个全表扫描默认指主键索引全表扫描,实际操作中非聚簇索引也存在全表扫描;

覆盖索引简单点理解就是查询的条件和要查询的值都在同一颗索引树上这种现象称为覆盖索引可以通过执行计划查看,和索引类型是不是唯一索引,关联索引没有联系;覆盖索引是经常用来做索引优化的一种手段(覆盖索引也存在慢操作);

最左前缀 - 关联索引时候使用,这个最左指的不是字段上的最左,可以是字符串级别的;比如 name,age 是关联索引 name 用模糊查询也是最左前缀; 索引下推(Icp) - 5.6以后引入的机制,关联索引使用,不过 ICP 在explain执行索引计划时候 可能没遇到ICP,也会显示 using index condition;

回表 - 查完索引要去主键索引树上查一下,多了一次磁盘 io;

小问题:

person 表中有 id、name、age、gender四个属性id为主键索引,name,age组合为联合索引;这条SQL属于 回表、覆盖索引、最左前缀、索引下推中的那些场景?

select id,name,age from person where name like '赵%';

参考答案:

① 没有回表!因为关联索引会存储主键id。

② 查询列的数据都能在关联索引所在的索引树上查到,所以满足覆盖索引的条件;

③ 字符串可以通过前n个字符检索数据进行索引前缀查询,所以也满足最左前缀;

④ 不满足索引下推,索引下推是5.6引入的优化机制,为了减少回表次数; 没有发生回表操作也就不存在索引下推;