MySQL索引分析_01
表结构如下
表名为T,主键是id 自增, 新建索引name.
1 | CREATE TABLE `T` ( |
using Index
1 | EXPLAIN SELECT id from t where name ='lisi'; |
使用了覆盖索引 要查的id 就在name索引的叶子结点上
using where
在使用索引的情况下,需要回表查询数据
using where & using Index
1 | EXPLAIN SELECT id from t where name LIKE 'li%'; |
使用了索引,所需要的数据在索引列上都能找到, 不需要回表操作
using Index condition
1 | EXPLAIN SELECT * from t where name LIKE 'li%'; |
虽然使用了索引,但是还需要回表查询数据
索引下推
在MySQL5.6以后引入新特性 索引下推
1 | CREATE INDEX test2 ON T (name,age) |
在MySQL5.6版本以前 上述SQL执行流程:
因为name和age是联合索引,但是因为name是范围查询(> < between like) 根据name排序之后age索引就失效了 所以就带着id去回表查询age是否复合条件
和下图(列名不同)但原理相同
MySQL5.6以后引入索引下推SQL执行流程是
在根据name查询以后,InnoDB 在 (name,age) 索引内部就判断了 age 是否等于 10,对于不等于 10 的记录,直接判断并跳过。在我们的这个例子中,只需要对 ID4、ID5 这两条记录回表取数据判断,就只需要回表 2 次。
Comments