0

我有以下查询:

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

如上所述使用时确实需要一些时间(大约 5 秒)ORDER BY。如果我不使用ORDER BY它真的很快(0.08 秒)。

解释告诉我将创建一个临时表: 在此处输入图像描述

零件的两个字段上order by都有一个普通索引 (asc)。

这是问题吗?我怎样才能避免这种情况?

TIA 马特

4

1 回答 1

1

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

除了“毕业生”引号之外,您在排序的两个字段上都有键这一事实并不意味着 MySQL 将能够使用它们进行排序,在这种情况下,它不是。引用MySQL ref 的 ORDER BY Optimization

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

…</p>

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

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

SELECT通过让这个+ORDER组合加速来避免这个问题会让你非常头疼,如果它甚至可能的话。就个人而言,在这种情况下,如果可能的话,我会在检索后对数据进行排序。再说一次,我建议不要JOIN在单个查询中使用超过三重或四重的 s(快速搜索会告诉你很多人已经在一个单一的问题上遇到了这个问题JOIN),因此会寻找一种解决方案来避免这种 duodecuple 加入其整体。

于 2013-08-28T09:21:51.340 回答