簡體   English   中英

在查詢中為“OR”運算符創建索引

[英]Creating indexes for 'OR' operator in queries

我有一些條件的MySQL查詢

where field1=val1 or field2=val2

還有一些像

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

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

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

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

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

我將從最簡單的方案開始,每個列上有四個單獨的索引。

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

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

然后, 只有當您遇到性能問題時,才可以考慮使用不同的索引來改進它。 您應該測試生產類型數據的性能,而不是您自己構建的任何測試數據庫(除非它們反映生產的屬性)。

請記住,數據庫調優很少是一種“一勞永逸”的操作。 您應該定期重新調整,因為性能取決於架構您擁有的數據。

即使架構永遠不會改變,數據也可能會有很大差異。 重新評論“我只是不能通過應用索引和解釋查詢進行實驗”,這正是你應該做的。

如果你擔心在生產中玩(你應該這樣),你應該設置另一個具有相似規格的環境,將生產數據復制到它,然后在那里擺弄你的索引。

我的直覺是為第一個查詢創建第一個查詢的field1和field2的單獨索引,因為它是一個OR,因此復合索引可能不會有多大好處。

那是對的。

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

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

EXPLAIN會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM