我有一个需要很长时间才能执行的查询。这里的查询:我应该索引哪些列?
SELECT *
FROM `posts`
WHERE `posts`.`id` IN (... MANY MANY DOZENS OF IDs ...)
ORDER BY `created_at` DESC;
请问我创建只是id
或两个id
和created_at
的指数?
我有一个需要很长时间才能执行的查询。这里的查询:我应该索引哪些列?
SELECT *
FROM `posts`
WHERE `posts`.`id` IN (... MANY MANY DOZENS OF IDs ...)
ORDER BY `created_at` DESC;
请问我创建只是id
或两个id
和created_at
的指数?
对于您的查询,只有在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的实践中很有用。
如果只有一个ID,您为什么需要重新排序? – FrankerZ
@FrankerZ。 。 。如果'id'是唯一的,则不需要重新排序。 –
您可以在两者上创建索引,但您的基本方法存在缺陷。您应该将这些ID插入表中并加入。 – bernie