分组操作,我们主要来看看索引对于分组操作的影响。
首先我们先将 tb_user 表的索引全部删除掉,避免对我们接下来的测试产生影响 。
drop index idx_user_pro_age_sta on tb_user;
drop index idx_email_5 on tb_user;
drop index idx_user_age_phone_aa on tb_user;
drop index idx_user_age_phone_ad on tb_user;
接下来,在没有索引的情况下,执行如下SQL,查询执行计划:
-- 前面不要写 * ,没有任何意义,直接写分组的字段以及聚合函数
explain select profession, count(*) from tb_user group by profession;
可以看见,ALL全表扫描,并没有用到任何索引,Using temporary
:用到了临时表,这个性能是比较低的。
然后,我们在针对于 profession , age, status 创建一个联合索引。
紧接着,再执行前面相同的SQL查看执行计划。
explain select profession , count(*) from tb_user group by profession ;
可以看见,用到了索引,并且type由ALL优化为了index,Using temporary
也优化为了 Using index
。
再执行如下的分组查询SQL,查看执行计划:
我们发现,如果仅仅根据age分组,就会出现 Using temporary ;而如果是根据 profession,age两个字段同时分组,则不会出现 Using temporary。原因是因为对于分组操作, 在联合索引中,也是符合最左前缀法则的。
但如果只根据age来分组,不满足最左前缀法则,因此出现了临时表。
接下来继续测试:根据age分组,然后使用profession进行过滤;我要查询专业为软件工程的用户,对其根据年龄进行分组操作。
可以发现并没有出现 Using temporary
,原因就是因为profession出现了,满足最左前缀法则,所以出现了 Using index
。
所以,在分组操作中,我们需要通过以下两点进行优化,以提升性能:
A. 在分组操作时,可以通过索引来提高效率。
B. 分组操作时,索引的使用也是满足最左前缀法则的。