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
被忽略。
那个查询将这样执行:
- 将 table 中所有行的有效组合(基于
ONs
)连接在一起。这会产生一个潜在的大温度 table。这个临时文件 table 将包括一堆列 -- 标题等
- 执行
GROUP BY
。这可能需要对上面的 temp table 进行排序。这可能会缩小到更小的温度 table。由于此 GROUP BY
必须在 之前 ORDER BY
执行,因此与 ORDER BY
相关的任何索引都无济于事。
- (再次)排序以获得所需的
ORDER BY
。
- 提供前 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.
我正在使用 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
被忽略。
那个查询将这样执行:
- 将 table 中所有行的有效组合(基于
ONs
)连接在一起。这会产生一个潜在的大温度 table。这个临时文件 table 将包括一堆列 -- 标题等 - 执行
GROUP BY
。这可能需要对上面的 temp table 进行排序。这可能会缩小到更小的温度 table。由于此GROUP BY
必须在 之前ORDER BY
执行,因此与ORDER BY
相关的任何索引都无济于事。 - (再次)排序以获得所需的
ORDER BY
。 - 提供前 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.