我的查询需要花费很长时间才能执行。这是查询:
SELECT *
FROM `posts`
WHERE `posts`.`id` IN (... MANY MANY DOZENS OF IDs ...)
ORDER BY `created_at` DESC;
我会仅在id
或id
和created_at
创建索引吗?
答案 0 :(得分:1)
对于您的查询,仅posts(id)
上的索引最佳。如果列表中只有一个id
,那么您可以执行posts(id, creaated_at)
。
如果order by
占用大部分时间,您可以尝试以下版本:
select p.*
from (select p.*
from posts p
order by created_at desc
) p
where p.id in (. . .);
在某些情况下,如果您在posts(created_at)
上有索引,则可能会阻止排序。我对此公式并不感到兴奋,因为它取决于返回有序结果的子查询 - 这在MySQL的实践中有效。