MySQL:为什么'explain'命令在同一个SQL语句中产生不同的结果?

时间:2012-11-15 02:29:36

标签: sql mysqli query-optimization explain

我将MySQL数据库从一个环境迁移到另一个环境,并发现迁移后,特定查询的运行速度比以前慢得多。

我正在调查带有'explain'关键字的语句(如下所示),并发现'explain'命令在不同的服务器上提供不同的输出。

explain select distinct j.job,f.path,p.path  
from fixes f
join  jobs j on  f.job=j.id 
join  paths p  on p.id =f.path  
where p.path like '//depot1/Dev\-trunk/%' ;

对于原始的,它给出:

    1   SIMPLE  p   range   PRIMARY,path    path    752     **19**  Using where; Using index; Using temporary
    1   SIMPLE  f   ref path,job    path    8   p.p.id  **6448356** 
    1   SIMPLE  j   eq_ref  PRIMARY PRIMARY 8   p.f.job **1**   

同样的陈述在新环境中产生不同的输出:

    1   SIMPLE  j   index   PRIMARY job 62      **68486**   Using index; Using temporary
    1   SIMPLE  f   ref path,job    job 8   p.j.id  **812** 
    1   SIMPLE  p   eq_ref  PRIMARY,path    PRIMARY 8   p.f.path    **1**   Using where

1 个答案:

答案 0 :(得分:2)

仅供参考,事实证明,在迁移数据库时,有一些统计数据用于引擎优化器决定最佳策略,例如连接表,显然没有被复制。

解决方案是在每个表上运行 ANALYZE 以“重建”此类信息。因此,在对每个表执行ANALYZE并再次运行explain命令后,输出同意并且查询速度显着增加。