MySQL中group by的优化

我的tb_user中的数据:

MySQL中group by的优化_第1张图片

老规矩,先把tb_user表中的我们后建的索引删掉,然后查看当前tb_user中存在的索引:

show INDEX FROM tb_user;

image-20221006163552518

此时只有一个主键索引

接下来,我们在没有索引的情况下, 执行下面的SQL语句,所查询出的结果:

SELECT profession,count(*) FROM tb_user GROUP BY profession;

MySQL中group by的优化_第2张图片

查看这条查询语句的执行计划:

EXPLAIN SELECT profession,count(*) FROM tb_user GROUP BY profession;

image-20221006164149078

可以看到Extra中显示使用了临时表,这性能可就低了啊,怎么破,尝试针对profession、age、status创建一个联合索引

CREATE INDEX idx_user_pro_age_sta ON tb_user(profession,age,status);

然后,我们再来执行前面相同的SQL来查看执行计划

EXPLAIN SELECT profession,count(*) FROM tb_user GROUP BY profession;

image-20221006164722850

OK,加了索引之后果然管用,用不着使用临时表了,不过这里要注意的是,我创建的是profession在前的一个多字段联合索引,只建profession的索引执行上面的SQL语句效果一样,我建这个联合索引主要是为了下面的测试。

我上面不是建了professionagestatus的联合索引吗,我如果执行下面的SQL语句,会使用到临时表吗

EXPLAIN SELECT profession,count(*) FROM tb_user GROUP BY profession,age;

image-20221006170629218

EXPLAIN SELECT age,count(*) FROM tb_user GROUP BY age;

image-20221006170725770

可以发现,如果仅仅根据age分组,就会出现Using temporary;而如果是根据profession、age两个字段同时分组,则不会出现Using temporary。原因是因为对于分组操作,在联合索引中,也是符合最左前缀法则的。

所以,在分组操作中,我们可以通过以下两点进行优化,以提升性能:

  • 在分组操作中,可以通过索引来提高效率。
  • 分组操作中,索引的使用也满足最左前缀法则

你可能感兴趣的:(MySQL,mysql,sql,数据库)