2012-12-17 42 views
5

我在MySQL中遇到大數據集的問題,我正在探索很多不同的索引方法。誰能告訴我有什麼區別,如果我不是分別宣佈他們,而申報的幾個指標一起一起或分別聲明索引,有什麼區別?

ALTER TABLE `db`.`test` ADD INDEX `someindex` (field1, field2, field3); 

ALTER TABLE `db`.`test` ADD INDEX `f1` (field1), ADD INDEX `f2` (field2); 

爲什麼要一起申報或分開申報?

+0

您只在第一條語句中創建1個索引。這就像搜索基於last_name,first_name,initial的電話簿。第二個陳述就像兩本電話簿:一個是姓氏,另一個是first_name。 – Glenn

+0

[查看關於這個問題的答案。它提到了他們關於索引。](http://stackoverflow.com/questions/13892952/database-schema-confusing-index-and-constraints) –

回答

6

在我所教的MySQL培訓課程,並討論多列索引的時候,我用一個比喻來電話簿。電話本基本上是姓氏的索引,然後是名字。所以排序順序是由哪個「列」首先確定的。搜索分爲幾類:

  1. 如果你查到姓史密斯的人,你可以很容易地找到他們,因爲這本書是按姓氏排序的。
  2. 如果你看到名字叫約翰的人,電話簿並沒有幫助,因爲約翰斯分散在整本書中。你必須掃描整個電話簿才能找到它們。
  3. 如果您查找具有特定姓氏Smith和特定名字John的人,本書可幫助您找到Smiths排序在一起,並且在Smiths組內,Johns也以排序順序排列。

如果你必須通過名字排序,然後按姓氏進行的電話本,書的分類將有助於您在上述情況下,#2,#3,但不區分#1。

這解釋了查找精確值的情況,但是如果您正在查看值範圍,該怎麼辦?假設你想找到所有名字叫約翰,姓氏以'S'開頭的人(Smith,Saunders,Staunton,Sherman等)。 Johns在每個姓氏的下面都被排序爲J,但是如果你想讓所有的姓氏以S開始,那麼Johns就不會被分組在一起。它們又被分散了,所以你最終不得不掃描所有以'S'開頭的姓氏。而如果電話簿按姓氏和姓氏組織起來,你會發現所有的約翰在一起,然後在約翰內部,所有的姓氏將被分組在一起。

因此,多列索引中列的順序絕對重要。一種類型的查詢可能需要索引的特定列順序。如果您有幾種類型的查詢,則可能需要多個索引來幫助他們,並使用不同順序的列。

有關更多詳細信息和示例,請參閱我的演示文稿How to Design Indexes, Really。或者在video上觀看我的演講。

1

數據庫通常只能爲每個查詢使用一個索引,因此假設所有三列都在'where'子句中,您將需要單個複合索引。

但是,複合索引只能從左到右部分使用,所以如果你有另一個查詢,比如說field1,那麼複合索引仍然會被使用。但是,對於'where'子句中只有field2的查詢,該索引不能使用,並且您需要一個只位於field2的索引,或者一個索引,它是複合的,但是以field2開頭。

對此進行了詳細解釋[MySQL文檔]

相關問題