订单减慢查询速度

时间:2013-08-28 07:55:09

标签: mysql indexing query-optimization

我有以下查询:

select 
    `gasr`.`RID`,
    `gasr`.`ID`,
    `gr`.`RID`,
    `gr`.`TID`
    ...
from
    (((((((((((( `gasr`
    left join `gasro` ON ((`gasr`.`ID` = `gasro`.`ARID`)))
    left join  `gro` ON ((`gro`.`RID` = `gasr`.`RID`)))
    left join  `p` ON ((`p`.`ID` = `gasr`.`ID`)))
    left join  `l` ON ((`l`.`ID` = `p`.`LID`)))
    left join `k` ON ((`k`.`ID` = `p`.`KID`)))
    left join  `s` ON ((`s`.`ID` = `p`.`TID`)))
    left join  `ad` ON ((`ad`.`ID` = `p`.`DID`)))
    left join  `ae` ON ((`ae`.`ID` = `p`.`EID`)))
    left join  `gr` ON ((`gasr`.`RID` = `gr`.`ID`)))
    left join  `gs` ON ((`gs`.`ID` = `gr`.`SID`)))
    left join `ka` ON ((`ka`.`ID` = `gs`.`KID`)))
    left join `m` ON ((`m`.`ID` = `ka`.`MID`))) 
ORDER BY gs.ID, gr.RID

如上所述,使用ORDER BY时需要一些时间(约5秒)。 如果我不会快速使用ORDER BY(0.08秒)。

解释告诉我将创建一个临时表: enter image description here

order by部分的两个字段都是普通索引(asc)。

这是问题吗?我怎么能避免这个?

TIA 马特

1 个答案:

答案 0 :(得分:1)

frgtv10,我想对你说一句话,只需一个字:filesort

“毕业生”引用一边说,你在两个你要排序的字段上都有密钥的事实并不意味着MySQL可以使用它们进行排序,在这种情况下,它不是'吨。引用MySQL ref's ORDER BY Optimization

  

在某些情况下,MySQL无法使用索引来解析ORDER BY,....这些案例包括以下内容:

     

...

     
      
  • 您正在加入许多表,并且ORDER BY中的列并非全部来自用于检索行的第一个非常量表。 (这是EXPLAIN输出中第一个没有const连接类型的表。)
  •   

现在,这是否是一个真正的问题取决于您的查询的应用程序,特别是这个特定的查询是否允许缓慢。

通过让这个SELECT + ORDER组合达到速度来避免这个问题会让你头疼,如果它甚至可能的话。就个人而言,在这种情况下,如果可能的话,我会在检索之后对数据进行排序。然后,我建议不要在单个查询中使用三倍以上或四倍JOINquick search将向您显示许多人已在单个JOIN上遇到此问题,并且因此,我们会寻找一种能够完全避免这种十二进制连接的解决方案。