我正在使用mysql。并在表 D 中的 'playCount' 'desc' 上創建索引。但是,它不適用。因此,我在表 D 中的“aId ASC,playCount DESC”上創建了索引。但是,它也不適用。
Order by 太慢了,請告訴我如何在我的代碼上創建索引。
explain SELECT `A`.`id` AS `id`, `A`.`title` AS `title`, `A`.`img` AS `img`
FROM `A` `A`
INNER JOIN `B` `B` ON `B`.`aId`=`A`.`id`
INNER JOIN `C` `C` ON `C`.`id`=`B`.`cId`
LEFT JOIN `D` `D` ON `D`.`aId`=`A`.`id`
GROUP BY `A`.`id`
ORDER BY `D`.`playCount` DESC
LIMIT 10;
uj5u.com熱心網友回復:
可能至少有兩個原因ORDER BY可能會被忽略。
該查詢將以這種方式執行:
ONs將這些表中行的所有有效組合(基于 )連接在一起。這會生成一個可能很大的臨時表。這個臨時表將包括一堆列——標題等。- 執行
GROUP BY. 這可能需要對上面的臨時表進行排序。這可能會縮小到更小的臨時表。由于這GROUP BY必須在之前執行ORDER BY,因此沒有與 相關的索引ORDER BY可以提供幫助。 - 排序(再次)以獲得所需的
ORDER BY. - 交付前 10 行。這有效地拋棄了自第 1 步以來一直攜帶的任何笨重的東西(標題?)(除了前 10 個)。
如果有一個WHERE子句,添加一個INDEX可能會有所幫助。
INDEX(aId ASC, playCount DESC)-- 好吧,我需要問一下您使用的是什么版本的 MySQL。始終允許混合 ASC 和 DESC,并且排序始終正常作業。但DESC在 8.0 版之前一直在索引中被忽略。(不過,正如我已經指出的那樣,不能使用索引。)
如果您想進一步討論這個問題,請提供SHOW CREATE TABLE每張桌子,每張桌子EXPLAIN SELECT ...的大致大小,以及這些桌子是 1:1 還是 many:many 或 many:1 相關。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459251.html
標籤:mysql 表现 sql-order-by
上一篇:如何加快熊貓回圈?
下一篇:為任何可迭代物件創建異步迭代器
