2016-07-26 67 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'是唯一的,則不需要重新排序。 –