如何避免回表查询?什么是索引覆盖? | 1分钟MySQL优化系列
原创: 58沈剑大佬
这篇文章写的太好了,正中尿点。
什么是回表查询?
InnoDB有两大类索引:1.聚集索引 2.普通索引
因此, InnoDB必须要有,且只有一个聚集索引:
-
如果表定义了PK,则PK就是聚集索引;
-
如果表没有定义PK,则第一个not NULL unique列是聚集索引;
-
否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
结论
从普通索引无法直接定位行记录,需要通过普通索引树检索到主键值然后再通过聚集索引树最终定位到行数据,此为回表查询也。
什么是索引覆盖?
explain的输出结果Extra字段为Using index时,能够触发索引覆盖。
如何实现索引覆盖?
盗一张图过来盗两张图过来 盗三张图过来
哪些场景,可以利用索引覆盖来优化SQL?
-
全表count查询优化 select count() 不要用* 括号里最好用索引字段
-
列查询回表优化
select id,name,sex ... where name='shenjian';
这个例子不再赘述,将单列索引(name)升级为联合索引(name, sex),即可避免回表。
- 分页查询
网友评论