2012-03-05 34 views
4

考慮具有是否需要在WHERE子句中使用INDEX第二列?

SELECT * FROM table WHERE column1='XX' && column2='XX' 

獲取數據MySQL將過濾用WHERE子句的第一部分相匹配的結果,則與第二部分。我對嗎?

想象一下,第一部分匹配10條記錄,並添加第二部分篩選5條記錄。第二列是否需要INDEX

+2

試試吧,這取決於您的數據集。另外,使用mysql的'EXPLAIN'功能。 – knittl 2012-03-05 13:33:22

回答

4

索引在MySQL中是可選的,但它們可以提高性能。

目前,MySQL只能使用每個表選擇一個索引,所以對於給定的查詢,如果您在column1和column2上都有索引,MySQL將嘗試確定最有利的索引,並且僅使用一。

如果選擇速度最重要,通用解決方案是創建一個包含兩列的多列索引。

這樣一來,即使MySQL的可以只使用一個索引表,將使用具有索引的兩列的多列索引,MySQL的允許就這兩個條件快速過濾的WHERE子句。

在多列索引中,您將首先放置最高基數(不同值的最高數目)的列。

爲了進一步優化,可以在某些情況下應用"covering" indexes

請注意,索引可以提高性能,但會帶來一些成本。索引增加了內存和存儲需求。另外,在將記錄更新或插入表中時,相應的索引需要維護。實施索引時必須考慮所有這些因素。

更新: MySQL 5.0現在可以通過合併來自每個索引的結果以及一些注意事項來使用多個列的索引。

下面的查詢是Index Merge Optimization一個很好的候選人:

SELECT * FROM t1 WHERE key1=1 AND key2=1 
+0

非常有趣的點和有用的信息! – Googlebot 2012-03-05 14:26:42

1

您沒有索引第二列,但它可以加快你的SELECT

5

你說的是短路評價。 DBMS具有基於成本的優化器。有沒有擔保這兩個條件將得到首先評估。

要將它應用於您的問題:是的,可能會將您的第二列索引。

  • 是否在搜索中使用regulary?
  • 執行計劃告訴你什麼?
  • 訪問模式在不久的將來會發生變化嗎?
  • 表中包含多少條記錄?
  • 覆蓋指數會是更好的選擇嗎?
  • ...
2

在處理這樣的查詢RDBMS將只使用一個索引。對兩個colums分別指數將允許它選擇一個更快的指標。

是否需要取決於具體情況。

  • 查詢速度慢嗎?
  • 索引在另一列會更快嗎?
  • 包含 列的索引會更快嗎?

您可能需要嘗試測量幾種方法。