我有一個需要很長時間才能執行的查詢。這裏的查詢:我應該索引哪些列?
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