2011-12-05 66 views
0

我們有一個查詢這是這樣的:我是否需要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_idmodified_date一個綜合指數?

+1

您選擇的*會減少擁有索引的值,因爲您的查詢仍然需要執行密鑰查找以獲取剩餘的值。但是,索引應該更快。最好明確列出要返回的列,並在創建索引時將它們列在INCLUDE子句中。 – sfuqua

回答

0

你不需要一個綜合指數,但滿足some_fk_idmodified_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在表中具有非常高的選擇性,則可能不需要二級索引。

+0

它正在執行一個文件夾,我如何避免上述命令?我會嘗試使用索引並更新你 – priya

0

不適用於ORDER BY - 適用於結果集行被選中。如果您定期基於modified_date進行選擇,則可能需要考慮其中一項。

順便說一下,您提供的語句選擇modified_date>兩個不同的值。那應該是一個'>'和一個'<'?

+0

是的,我已經修改了我的問題 - 對於輸入錯誤 – priya

0

這取決於您的數據,但是對於modified_date的索引可能對於位置和順序都是有益的。

如果外鍵條件只給你幾行,那麼以任何方式按日期排列行將很便宜。

+0

好的,我會試試這個 – priya

相關問題