最左前缀原则和覆盖索引相关问题
索引为abc,where里面和select里面是ac,需要回表吗
结论:不需要
- 最左前缀原则:
WHERE a AND c
无法高效使用(a,b,c)
中的c
列(缺少b
),只能基于a
定位后再过滤。 - 覆盖索引:
若查询字段全在索引中,则无需回表(否则需回表)。 - 回表 = 随机I/O:
二级索引返回的主键是离散值,回表时访问磁盘位置不连续。 - 索引存储 vs 数据存储:
二级索引按索引键排序,数据按主键排序,二者顺序不一致导致回表效率低。
总结:
-
WHERE条件中使用了a和c:索引只能使用a来快速定位,然后扫描所有a匹配的索引条目,并在索引条目中过滤c的条件(这时不需要回表,因为c在索引中)。
-
如果SELECT的列只有a和c(或者再加上b),那么整个查询只需要在索引中就能完成(覆盖索引),不需要回表。
-
如果SELECT的列包含了索引中没有的列,那么就需要回表。
注:学习SQL中最左前缀原则和覆盖索引相关问题
-
学习的视频:141-数据准备与索引失效的11种情况1_哔哩哔哩_bilibili
-
答案来源:deepseek