MySQL 怎么用索引实现 group by?

0311dd02a9149c7fd68124f19f218dae.png

若有收获,请记得分享和转发哦

我们用 explain 分析包含 group by 的 select 语句时,从输出结果的 Extra 列经常可以看到 Using temporary; Using filesort。看到这个,我们就知道 MySQL 使用了临时表来实现 group by。

使用临时表实现 group by,成本高,执行慢。如果能够利用索引中记录已经排好序的特性,使用索引来实现 group by,那就是鸟枪换炮了。

本文我们一起来探寻 MySQL 使用索引实现 group by 的过程,使用临时表实现 group by 会单独用一篇文章来介绍。

本文内容基于 MySQL 5.7.35 源码。

内容目录

  1. 引言

  2. 紧凑索引扫描

  3. 松散索引扫描

  4. 两种索引扫描怎么选?
    4.1 松散索引扫描成本更高怎么办?
    4.2 为什么松散索引扫描会比紧凑索引扫描成本高?

  5. 总结

4d10d0c370dfd74f23465ad59eba2dbe.png

f437f2177ccd90e093adc9841651dcc5.png

3ba8e3c28265ad2f5cf8f62c8a1a48a4.png

3c697455b12fb28ed85d0f9a1811e3f2.png

a1634fbeed90d080176edad18c39a178.png

3513d628cb76f8bfe15e31d4e9b4f387.png

3e1af476625368ba72d0c781a6034380.png

f5259220ea4fd0ed3bc9ff158641b493.png

7e0022cb17b3b4b089b5d42349ec17a2.png

781f029ce4f74481fb7d20f68bfcff31.png

d3d2bc41abeddacce16ba911dbbd1965.png

621a2bb8ed91c14cf43e8ba2b0cf3efd.png

2f51309532a4b246bf2c6e7acdf9efc8.png

0f58f2a1d702be4d2d8c34327835b18e.png

333cdd76e88559c912186474e6e429ee.png

79cfd3fac4a59dd875734d24654486a8.png

64557dea206b2547455e880fa6b6ffe5.png

993277d53f5a19abe35d5ef558edbea3.png

718f33296cc751e276c6b1933326efae.png