2016-07-26 69 views
2

我有一个需要很长时间才能执行的查询。这里的查询:我应该索引哪些列?

SELECT * 
FROM `posts` 
WHERE `posts`.`id` IN (... MANY MANY DOZENS OF IDs ...) 
ORDER BY `created_at` DESC; 

请问我创建只是id或两个idcreated_at的指数?

+2

您可以在两者上创建索引,但您的基本方法存在缺陷。您应该将这些ID插入表中并加入。 – bernie

回答

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的实践中很有用。

+0

如果只有一个ID,您为什么需要重新排序? – FrankerZ

+0

@FrankerZ。 。 。如果'id'是唯一的,则不需要重新排序。 –