mysql OrderBy 不使用索引

mysql OrderBy not using index

我正在使用 mysql。 并在 table D 中的 'playCount' 'desc' 上创建索引。 然而,它并不适用。 因此,我在 table 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;

可能至少有 2 个原因导致 ORDER BY 被忽略。

那个查询将这样执行:

  1. 将 table 中所有行的有效组合(基于 ONs)连接在一起。这会产生一个潜在的大温度 table。这个临时文件 table 将包括一堆列 -- 标题等
  2. 执行GROUP BY。这可能需要对上面的 temp table 进行排序。这可能会缩小到更小的温度 table。由于此 GROUP BY 必须在 之前 ORDER BY 执行,因此与 ORDER BY 相关的任何索引都无济于事。
  3. (再次)排序以获得所需的 ORDER BY
  4. 提供前 10 行。这有效地扔掉了自第 1 步以来携带的任何笨重的东西(标题?)(前 10 个除外)。

如果有 WHERE 子句,添加 INDEX 可能会有帮助。

INDEX(aId ASC, playCount DESC) -- 好吧,我需要问一下你用的是什么版本的MySQL。始终允许混合使用 ASC 和 DESC,并且排序始终可以正常工作。但是 DESC 在索引中一直被忽略,直到 8.0 版本。 (不过,正如我已经指出的那样,无法使用索引。)

如果您想进一步讨论这个问题,请提供每个 table、EXPLAIN SELECT ...SHOW CREATE TABLE、每个 table 的大概大小,以及 table 是相关的 1:1 或 many:many 或 many:1.