什么是索引回表,如何避免(索引覆盖)
聚簇索引
- * 如果表设置了主键,则主键就是聚簇索引
- * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
- * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引
其他 非聚簇
表中有四条记录:
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
聚集索引(存储行记录) 普通索引(叶子节点存储聚簇索引值)
聚簇索引查询会很快,因为可以直接定位到行记录
id是聚簇索引,name是普通索引。
普通索引 需要扫码两遍索引树
(1)先通过普通索引定位到主键值id=5;
(2)在通过聚集索引定位到行记录;
这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。
如何实现覆盖索引
常见的方法是:将被查询的字段,建立到联合索引里去。
哪些场景适合使用索引覆盖来优化SQL
全表count查询优化
1 2 3 4 5 6 |
|
例如:select count(age) from user;
使用索引覆盖优化:创建age字段索引
1 |
|
列查询回表优化
前文在描述索引覆盖使用的例子就是
例如:select id,age,name from user where age = 10;
使用索引覆盖:建组合索引idx_age_name(age,name)即可
分页查询
例如:select id,age,name from user order by age limit 100,2;
因为name字段不是索引,所以在分页查询需要进行回表查询,此时Extra为Using filesort文件排序,查询性能低下。
使用索引覆盖:建组合索引idx_age_name(age,name)
参考https://www.jb51.net/article/180267.htm
本文地址:https://blog.csdn.net/qq_27500493/article/details/107295078
上一篇: 第三次Java实训心得