2010-08-30 78 views
2

「OR」操作指標我有喜歡創建用於查詢

where field1=val1 or field2=val2 

有的像

where fieldx=valx and fieldy=valy and (field1=val1 or field2=val2) 

如何優化這些查詢通過創建索引條件的一些MySQL的查詢?我的直覺是爲第一個查詢爲field1和field2創建單獨的索引,因爲它是一個OR,因此組合索引可能不會有太大的好處。

對於第二個查詢,我打算爲上述原因再次創建2個索引:fieldx,fieldy,field1和fieldx,fieldy,field2。

該解決方案是否正確?這是一個非常大的表,所以我不能通過應用索引和解釋查詢來進行實驗。

+0

您可能會創建一個具有相同結構的新表,但只能使用要測試的數據子集並查看哪個索引最符合您的需求。 – 2010-08-30 07:20:43

+0

這是不可能回答這樣一個寬泛和簡單的問題。每個特殊情況都需要它自己的解決方案。使用EXPLAIN來測試您的查詢。其實,OR操作器不需要任何特殊的處理。它使用相同的索引作爲'WHERE field = value'單個條件 – 2010-08-30 07:24:10

+0

您忘記告訴我們該表僅用於閱讀還是有很多正在進行的CRUD操作... – 2010-08-30 08:11:29

回答

2

與所有DBMS優化問題一樣,它取決於您的執行引擎。

我會從最簡單的場景開始,每個列上有四個單獨的索引。

這將確保以您未預料到的方式使用這些列的任何查詢仍然可以正常運行(對於僅使用fieldy的查詢,fieldx/fieldy/field1索引將爲零)。

任何體面的執行引擎都會首先有效地選擇基數最低的索引,從而減少結果集,然後基於此執行其他過濾器。

然後,和只有如果您有性能問題,您可以考慮改進它與不同的索引。您應該測試生產類型數據的性能,而不是您自己構建的任何測試數據庫(除非它們反映生產屬性)。

請記住,數據庫調整很少是一個設置和忘記操作。您應該定期重新調整,因爲性能取決於您持有的數據的模式

即使架構永不改變,數據可能會大不相同。請回復您的評論「我只是不能通過應用索引和解釋查詢來進行實驗」,那就是您應該做的

如果你擔心在生產環境中玩遊戲(你應該是),你應該建立另一個類似規格的環境,將生產數據複製到它,然後在那裏擺弄你的索引。

+0

我同意你的說法。 – 2010-08-30 08:10:13

1

我的直覺是創造FIELD1和FIELD2獨立 索引 第一個查詢,因爲它是一個OR,所以可能是一個 綜合指數不會做太大 好。

這是正確的。

對於第二個查詢我打算創建2個 指標:fieldx,fieldy,Field 1和 fieldx,fieldy,FIELD2再次爲 上述原因。

這是一個選項,另一個選項是fieldx,fieldy,field1和field2上的索引(與第一次查詢相同!)。現在你也有兩個索引,但第二個索引會小得多。您的第二個查詢可以使用兩個索引,其中較大的一個用於查詢的AND部分,另一個用於field2的OR部分的小索引。 MySQL現在應該足夠聰明。

EXPLAIN將幫助你。