我有以下查询:
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秒)。
解释告诉我将创建一个临时表:
order by
部分的两个字段都是普通索引(asc)。
这是问题吗?我怎么能避免这个?
TIA 马特
答案 0 :(得分:1)
frgtv10,我想对你说一句话,只需一个字:filesort
“毕业生”引用一边说,你在两个你要排序的字段上都有密钥的事实并不意味着MySQL可以使用它们进行排序,在这种情况下,它不是'吨。引用MySQL ref's ORDER BY Optimization:
在某些情况下,MySQL无法使用索引来解析ORDER BY,....这些案例包括以下内容:
...
- 您正在加入许多表,并且ORDER BY中的列并非全部来自用于检索行的第一个非常量表。 (这是EXPLAIN输出中第一个没有const连接类型的表。)
现在,这是否是一个真正的问题取决于您的查询的应用程序,特别是这个特定的查询是否允许缓慢。
通过让这个SELECT
+ ORDER
组合达到速度来避免这个问题会让你头疼,如果它甚至可能的话。就个人而言,在这种情况下,如果可能的话,我会在检索之后对数据进行排序。然后,我建议不要在单个查询中使用三倍以上或四倍JOIN
个quick search将向您显示许多人已在单个JOIN
上遇到此问题,并且因此,我们会寻找一种能够完全避免这种十二进制连接的解决方案。