关于紧凑索引扫描和松散索引扫描快慢的问题

来源:3-9 GROUP BY语句调优与DISTINCT语句调优

qq__6238

2020-09-09 20:22:43

select emp_no, min(salary)
from salaries
group by emp_no
select emp_no, sum(salary)
from salaries
group by emp_no;

发现下面的使用紧凑索引扫描反而更快,这是为什么呢?

写回答

1回答

大目

2020-09-09

您好,执行出来的效果和预期不同原因有很多方面:

  1.  可以看下explain的结果,是否确实使用了松散索引扫描,从SQL来看,是会用的,但MySQL优化器是一个及其复杂的东西,如果优化器分析出来不走松散索引扫描开销更小,那也可能不用松散索引扫描的(可以借助OPTIMIZER TRACE分析MySQL选择的执行路径)

  2. 如果你运行MySQL的机器上运行了多个进程,那极有可能是性能抖动导致,我们知道,CPU的核心数是有限的,机器上部署的进程比较多的话,那么极有可能机器执行松散索引扫描时,MySQL并没有抢到时间片执行,或执行了一半被其他进程抢走了时间片,都是可能的;

  3. 可以多次测试求平均值,这样获得的效果更加客观一些。

  4. 建议测试时,在一个较大的数据量下进行。

祝您学习愉快!

0
hq__6238
h 感谢大目老师的解释答疑,使用explain分析确实第一个的extra字段显示的是Using index for group-by,而第二个就是紧凑索引扫描,多次执行也一直都是紧凑扫描使用的时间更少(时间差了将近600ms),大目老师的意思是即使expain分析使用index for group-by,通过OPTIMIZER TRACE分析发现也显示使用了index for group-by,但是实际执行也可能不会使用吗?
h020-09-09
共1条回复

Java架构师-技术专家

千万级电商项目从0到100全过程,覆盖Java程序员不同成长阶段的核心问题与解决方案

2672 学习 · 5839 问题

查看课程