2013-04-03 52 views
2

我很困惑如何最好地在MySQL中索引表,並且需要使用最佳類型的索引構造方面的幫助。目前,我在此表上使用唯一鍵索引,但不知道這是否是最佳使用方法,並且在某些情況下,由於MySQL限制,我無法使用這種類型的索引。索引MySQL表的最佳查詢的替代方法?

該表由主鍵和n列,在這種情況下,以保持它的簡單N = 4。所以表看起來像這樣:PK,COL1,COL2,COL3,COL4

在COL1-N的值是VARCHAR處理典型地具有1至4個字符之間的長度。主鍵是col值的串聯。這樣典型的行可能看起來像以下:

A:B:C:D, A, B, C, D 
A:B:C:E, A, B, C, E 
A:B:F:F, A, B, F, F 

當第一元件是主鍵,和隨後的元件是COL1,COL2,等等

該表需要對查詢進行優化,而不是插入。我希望執行的查詢將有一個WHERE子句,我們知道1-4列中的一些值。因此,例如,我可能想要查找第二列爲'B'或'C'的所有行。一旦我有主鍵,我用它來加入另一個表。

我創建的col1-4唯一鍵(因爲它們是唯一的)。問題是,只要n變大(> 16),我就不能再創建唯一的鍵索引(對於唯一的鍵約束,MySQL被限制爲16列)。這不是問題,因爲主鍵確保唯一性。不過,我不確定的兩件事情:

a)是爲了優化查詢的速度使用的唯一鍵的良好指標?

b)如果我不能使用一個唯一的密鑰,我應該用什麼指標?

我有以下的選項,我不知道它(如果有的話)是最好的:

a)創建於(COL1,COL2,COL3,COL4)

B A單一指數)創建一個索引每列(col1),(col2)...(col-n)

c)創建一個索引每列,包含pk(pk,col1),(pk,col2),(pk, col-n)

任何幫助你可以提供非常感謝。

由於

菲爾

+0

我總是建議使用一個整數作爲你的PK。爲什麼不添加一個ID列? – Fr0zenFyr

+0

在生產環境中,主要使用AI(自動遞增)整數。 – JoDev

+0

@ Fr0zenFyr爲什麼使用任意的ID如果有一個有意義的可用? – Sepster

回答

2

(col1, col2, col3, col4)索引只能用,如果WHERE子句包含在第一列的一個條件。這意味着,如果查詢不包含col1的條件,則索引根本無法使用(請參閱Multiple-Column Indexes)。如果你有這樣的疑問,應該定義更多的索引。這些可能是(col2, col3, col4)(col3, col4)(col4)

另一方面,(col1),(col2),(col3)(col4)也是一個不錯的選擇。在這種情況下,不需要在索引中包含主鍵。我更喜歡這個解決方案,而不是上述的解決方案。

我發現你的主鍵奇怪的選擇。如果(col1, col2, col3, col4)是唯一的,則將其用作主鍵。如果您不想在四列上使用主鍵(大多數人不這樣做),那麼下一個選項通常是替代鍵(即MySQL中的auto_increment列)。在這種情況下,(col1, col2, col3, col4)上的唯一密鑰會強制執行數據完整性。

+0

我認爲,級聯PK的意義在於,當n變大時,複合鍵變得不切實際,但PK仍然是「可搜索的」。無論如何,這個答案是否仍適用於n> 16的OPs場景? – Sepster

+0

我使用主鍵列,因爲我的查詢響應需要連接的鍵。由於這是唯一的保證,我沒有看到需要一個單獨的自動增量列。我使用主鍵加入到另一個表,所以如果這種設計以任何方式減慢查詢速度,那麼也許我應該改變它。我可以使當前的主密鑰成爲一個唯一的密鑰,並擁有一個汽車公司。然後按照您的建議分別索引我的其他列。 – Phil

+0

@Phil:由於VARCHAR pk上的I/O,肯定存在性能問題。如果VARCHAR的大小很小,那是沒問題的。 ;) – Fr0zenFyr

0

MySQL只要您搜索確切的鍵值(不是範圍),就可以合併連接PK中單個表內的多個索引。

所以,如果你在col1創建單獨的索引到colN,您可以運行此查詢:

SELECT * 
FROM mytable 
WHERE col2 = 'B' 
     OR 
     col3 = 'C' 

,這將導致對col2col3合併索引加入(你會看到它爲index_merge using union(col2, col3)EXPLAIN輸出)。爲了確保唯一性,只需要聲明第一列PRIMARY KEY就足夠了,所以只要保持數據一致性(PK值確實是連接和分隔的col*值),您的數據唯一性將由PK進行管理。

+0

不是關於這個VARCHAR PK的情況,但我記得遇到了一個情況,我在DB中有太多的垃圾(數據重複),沒有唯一的索引,只是一個pk(INT)索引。我無法真正找到一種方法來保持我的開發環境中的數據一致性(幸運的是我!)。 – Fr0zenFyr

相關問題