优化索引,避免回表查询

1,187 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

首先先看一篇网上关于《回表及索引覆盖》介绍的文章,讲的很清楚:mysql覆盖索引与回表

示例1:
1.异地登录 查询sql:

SELECT uuid,count(*AS cnt FROM events_xxxxlogin_202106 WHERE appid = ? AND status = 2 GROUP BY uuid;\

2.原始索引:
KEY idx_appid_status (appid,status),

3.优化后索引(增加uuid字段到联合索引中):

alter table events_xxxxlogin_202106 add key idx_appid_status_uuid(appid,status,uuid);

4.优化效果:

5.为啥加上这个索引就不需要回表???
因为目前该sql语句需要用到的字段有uuid、appid、status等,老版本的联合索引只有 "idx_appid_status (appid,status) "这两个,所以用到uuid分组时还需要通过 "回表" 去聚簇索引中查询uuid字段值。
但是一旦升级原先联合索引为 idx_appid_status_uuid(appid,uuid,status) 后,使用uuid字段时就无需再 "回表" 去聚簇索引中查询uuid字段了,一次遍历二级索引即可~
(索引覆盖:通过建立联合索引,做到只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快)

示例2:
sql语句报错示例(sql查询耗时约4秒):

SELECT quuid, COUNT(1AS cnt FROM events_xxxx WHERE appid = ? AND status = 0  GROUP BY quuid;


优化前无索引,优化后增加如下索引(避免回表):

优化效果(sql查询耗时约0.42秒):