MySQL中唯一索引的最大大小

15

MySQL中UNIQUE索引的最大大小是否存在限制?我在我的索引中有六个维度,导致索引非常庞大。 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      |         |               |
+-------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

2
你在单个表上有六个唯一约束?!这可能表明设计存在问题;-) - Ja͢ck
你的表格目前有多少行?它是MyISAM还是InnoDB? - Jocelyn
是的,同意。我会通过在其他地方强制唯一性来解决这个问题。不过,它提出了一个关于索引最大大小的问题,让我很好奇。 - Mad Echet
这不是6个唯一约束条件,而是一个跨越6列的约束条件。我不确定在其他地方强制执行唯一性是否是答案。数据库是适当的地方来做这件事。也许如果您发布表定义,我们可以更好地了解您要做什么。 - bobwienholt
谢谢,我正在尝试使用六个维度聚合日志。由于整个过程需要一堆 cron 脚本(syslogs -> hadoop -> hive(按维度聚合)-> sqoop -> mysql),我想确保不会重复添加相同行,因此必须保证6列的唯一性。所有值都是INTTINYINTFLOAT,因此我与@svidgen解释的限制相距甚远。 - Mad Echet
1个回答

20
对于InnoDB表,所有索引列的限制为3072个字节,可能只考虑每列的前767个字节。

单列索引的索引键最多可以达到767个字节。任何索引键前缀都适用相同的长度限制。请参见第13.1.13节“CREATE INDEX Syntax”。

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


它实际上是说“任意长度的唯一约束条件”。 - Tom
2
@Tom 有趣...我很想听听更详细的解释。在大多数情况下,"arbitrary"并不是指"无视限制",而是指"在限制范围内任意取值"。 - svidgen
现在的InnoDB也限制了16列:https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html。 - Tomty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接