11 groupby语句后有索引查询和无索引查询有啥区别

vvEcho 2024-02-20 22:33:19
Categories: Tags:

groupby 后语句有索引,直接根据索引扫描来分组,且分完组后无须排序

groupby 后语句无索引,会全表扫描,扫描出来的数据分组完后组成一个临时表,然后对这个临时表的数据进行排序

针对group by查询的优化建议:

A.优先为 GROUP BY 字段创建索引

单字段分组:直接为分组字段建索引(如 ALTER TABLE t ADD INDEX idx(col))

多字段分组:使用联合索引,按最左前缀原则排列字段(如 (a,b) 支持 GROUP BY a,b)

B.使用覆盖索引

将SELECT和GROUP BY涉及的字段包含在索引中(如 CREATE INDEX idx ON t(a,b,c)),避免回表

C.调整临时表配置

若无法避免临时表,可增大tmp_table_size 和max_heap_table_size,减少磁盘临时表生成

D. 避免冗余排序

若无需排序结果,添加 ORDER BY NULL 跳过排序阶段(如GROUP BY a ORDER BY NULL)