2009-11-26 25 views
0

我有這樣的SQL:關於mysql索引,多列還是一個?

SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth 

這樣,我怎麼爲它創建索引?兩列

  • 一個指數
  • 二爲每列

這是更好的指標?

+0

我認爲要獲得完整答案,您需要更具體地瞭解數據包含在這些列中。他們有獨特的價值嗎?他們是什麼類型的? – 2009-11-26 15:17:56

回答

3

如果您正在針對該查詢進行優化,那麼a將是最佳優化。您的WHERE子句將首先檢查column_a,如果不匹配,則繼續檢查下一行。如果它在column_a的匹配,它將僅檢查column_b。因此,您需要首先按column_a排序的索引,然後按column_b排序,而不是兩個單獨的索引。

考慮這個,而不是一個OR條款,在那裏你會一般都需要2個單獨的索引,因爲OR說,「首先選擇所有的比賽爲column_a然後選擇所有的比賽爲column_b,獨立,最後合併結果集「。由於該查詢在檢查column_b時未使用column_a的反饋,因此您希望在該處使用不同的索引。

另外請注意,這是所有寫在非常籠統的條款。這些事情可能因案例而異,具體取決於數據的外觀。一種好的方法是創建一個索引,查看性能如何,放下它,創建另一個索引,然後選擇最好的索引。

+0

不,它不應該「如果不匹配,就繼續下一行」;你想要一個索引,它將範圍掃描。 – MarkR 2009-11-26 16:34:28

+0

事實上,「繼續」意味着走在桌子上,當你根本沒有索引時會發生什麼。 – 2010-11-11 20:44:28

0

爲了更好地閱讀,如果您的查詢包含兩個比較,您應該在兩列中有一個索引。

但是,如果您的查詢在where子句中只有第二列,您可以在第二列上創建另一個索引。

1

需要記住的是,同一索引中的2列或更多列的MySql索引可以工作,以便使索引生效。

所以要進行優化,您必須首先將column_a放入索引,然後再放入colun_b。 這是爲了避免表掃描。

0

你想要一個可以進行RANGE SCANNED的索引。使用EXPLAIN(請參閱文檔),它是你的朋友。

在這種情況下,column_a,column_b上的索引應該能夠被範圍掃描,但始終檢查EXPLAIN。在非生產數據庫上使用EXPLAIN,其數據與您的生產系統具有相同的架構和數量/分佈(將是)