我有這樣的SQL:關於mysql索引,多列還是一個?
SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth
這樣,我怎麼爲它創建索引?兩列
- 一個指數
- 二爲每列
這是更好的指標?
我有這樣的SQL:關於mysql索引,多列還是一個?
SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth
這樣,我怎麼爲它創建索引?兩列
這是更好的指標?
如果您正在針對該查詢進行優化,那麼a
將是最佳優化。您的WHERE
子句將首先檢查column_a
,如果不匹配,則繼續檢查下一行。如果它在是在column_a
的匹配,它將僅檢查column_b
。因此,您需要首先按column_a
排序的索引,然後按column_b
排序,而不是兩個單獨的索引。
考慮這個,而不是一個OR
條款,在那裏你會一般都需要2個單獨的索引,因爲OR
說,「首先選擇所有的比賽爲column_a
和然後選擇所有的比賽爲column_b
,獨立,最後合併結果集「。由於該查詢在檢查column_b
時未使用column_a
的反饋,因此您希望在該處使用不同的索引。
另外請注意,這是所有寫在非常籠統的條款。這些事情可能因案例而異,具體取決於數據的外觀。一種好的方法是創建一個索引,查看性能如何,放下它,創建另一個索引,然後選擇最好的索引。
不,它不應該「如果不匹配,就繼續下一行」;你想要一個索引,它將範圍掃描。 – MarkR 2009-11-26 16:34:28
事實上,「繼續」意味着走在桌子上,當你根本沒有索引時會發生什麼。 – 2010-11-11 20:44:28
爲了更好地閱讀,如果您的查詢包含兩個比較,您應該在兩列中有一個索引。
但是,如果您的查詢在where子句中只有第二列,您可以在第二列上創建另一個索引。
需要記住的是,同一索引中的2列或更多列的MySql索引可以工作,以便使索引生效。
所以要進行優化,您必須首先將column_a放入索引,然後再放入colun_b。 這是爲了避免表掃描。
你想要一個可以進行RANGE SCANNED的索引。使用EXPLAIN(請參閱文檔),它是你的朋友。
在這種情況下,column_a,column_b上的索引應該能夠被範圍掃描,但始終檢查EXPLAIN。在非生產數據庫上使用EXPLAIN,其數據與您的生產系統具有相同的架構和數量/分佈(將是)
我認爲要獲得完整答案,您需要更具體地瞭解數據包含在這些列中。他們有獨特的價值嗎?他們是什麼類型的? – 2009-11-26 15:17:56