我們有一個查詢這是這樣的:我是否需要ORDER BY列上的索引?
select *
from foo
where some_fk_id = <value>
and modified_date > 'date1'
and modified_date < 'date2'
order by modified_date desc;
我需要在上述情況下,以創建some_fk_id
和modified_date
一個綜合指數?
我們有一個查詢這是這樣的:我是否需要ORDER BY列上的索引?
select *
from foo
where some_fk_id = <value>
and modified_date > 'date1'
and modified_date < 'date2'
order by modified_date desc;
我需要在上述情況下,以創建some_fk_id
和modified_date
一個綜合指數?
你不需要一個綜合指數,但滿足some_fk_id
和modified_date
where子句可以用單獨的索引來完成(即非常快),如果你做的。
要做的最好的事情是查看查詢計劃和配置文件。
您可以看到使用EXPLAIN
查詢計劃:
EXPLAIN SELECT * FROM foo WHERE some_fk_id=1 AND modified_date > 'date1' AND modified_date < 'date2' ORDER BY modified_date DESC;
既沒有一個綜合指數試試吧,看看有什麼打算用它來了。可能發生的最糟糕的事情是filesort
- 如果你需要迅速,可以避免使用這些東西。
最重要的是,您將實際使用的查詢,數據和硬件的運行時間測試。在您的特殊情況下,複合索引所佔用的空間會讓您減慢搜索速度,而不僅僅是搜索條目。例如,如果some_fk_id在表中具有非常高的選擇性,則可能不需要二級索引。
它正在執行一個文件夾,我如何避免上述命令?我會嘗試使用索引並更新你 – priya
不適用於ORDER BY - 適用於結果集後行被選中。如果您定期基於modified_date進行選擇,則可能需要考慮其中一項。
順便說一下,您提供的語句選擇modified_date>兩個不同的值。那應該是一個'>'和一個'<'?
是的,我已經修改了我的問題 - 對於輸入錯誤 – priya
您選擇的*會減少擁有索引的值,因爲您的查詢仍然需要執行密鑰查找以獲取剩餘的值。但是,索引應該更快。最好明確列出要返回的列,並在創建索引時將它們列在INCLUDE子句中。 – sfuqua