2013-05-15 93 views
12

MySQL中有一個UNIQUE索引的最大大小? 我在我的指數有六個維度,這導致了一個巨大的指數。 是否有UNIQUE索引的基數限制?MySQL中UNIQUE索引的最大大小

我越來越奇怪的無法解釋的錯誤,並想知道是否有UNIQUE限制。 它可能來自唯一性限制嗎? 下面是它的樣子(我也不明白爲什麼最後三列的基數不會增加)。

+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| table |   0 | PRIMARY |   1 | column_1  | A   |   15 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   2 | column_2  | A   |  91948 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   3 | column_3  | A   |  924889 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   4 | column_4  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   5 | column_5  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
| table |   0 | PRIMARY |   6 | column_6  | A   | 15723114 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
+1

你有一個表六個獨特的約束?這可能表明設計中存在錯誤;-) –

+0

表格當前有多少行?是MyISAM還是InnoDB? – Jocelyn

+0

是的,同意了。我會通過在別處強制執行唯一性來解決這個問題。但是,它提出了一個觀點,即我對指數最大值很感興趣。 –

回答

13

對於InnoDB表,限制爲在所有索引列3072個字節,假定只服用第一767個字節的每一列的。

單列索引的索引鍵最多可達767個字節。 相同的長度限制適用於任何索引鍵前綴。請參見 13.1.13節「CREATE INDEX語法」。

InnoDB內部最大密鑰長度是3500字節,但是MySQL本身 將其限制爲3072字節。此限制適用於多列索引中組合索引鍵的長度 。

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html

所以,對文檔的嚴格依據,我會說,你可以在你的指數高達1000列(上一個InnoDB表的最大列數),前提是平均粒徑每個是3字節或更少。

對於MyISAM表,它是16列或1000字節中的較小者。

每個索引的最大列數爲16。

的最大密鑰長度爲1000個字節。這也可以通過 更改源代碼和重新編譯進行更改。對於長度大於 的250個字節的情況,使用的密鑰塊大小比默認的1024個字節大 。

http://dev.mysql.com/doc/refman/5.0/en/myisam-storage-engine.html

+0

它實際上是說「任意長度UNIQUE約束」 – Tom

+1

@Tom有趣......我會對這個意思的全面解釋感興趣。在大多數情況下,任意通常並不意味着「無視限制」,而是「限制範圍內任何價值的隨心所欲」。 – svidgen