有一个表包含的id数据多于实际数据数据。
user_id int unsigned NOT NULL,
project_id int unsigned NOT NULL,
folder_id int unsigned NOT NULL,
file_id int unsigned NOT NULL,
data TEXT NOT NULL
为此表创建唯一主键的唯一方法是(user_id,project_id,folder_id,file_id)的组合。我经常看到2列复合主键,但是可以有4个甚至更多吗?根据{{3}}:“所有存储引擎每个表至少支持16个索引,总索引长度至少为256字节。大多数存储引擎都有更高的限制。”所以我知道至少可以这样做。
过去,对于这些ID的各种组合,经常会对此表进行查询。例如,查找用户X的所有项目,查找用户X的所有文件,查找项目Y和文件夹Z的所有文件等。如果每个id列上都有单独的索引键,或者是否存在复合词已包含所有列的主键是否会使其他单个密钥冗余?表格中任何时候都会有大约1000万到5000万行。
总结一下:是否可以使用具有4个(或更多)id列的复合主键,如果有复合键,是否会为每个列冗余创建额外的单个键?
答案 0 :(得分:2)
是的,可以使用包含4个或更多列的复合主键。
它不一定会为每个列冗余提供额外的密钥。例如,key (a, b, c)
对查询SELECT ... WHERE b = 4
无效。对于该类型的查询,您宁愿使用key (b)
或key (b, c)
。
您需要检查预期的查询以确定您需要哪些索引。有关详细信息,请参阅此演讲:http://youtu.be/AVNjqgf7zNw
答案 1 :(得分:1)
如果数据模型支持,则可以。您没有太多关于您的整体数据库架构以及这些项目如何相互关联以确定这是否被视为最佳方法。换句话说,这真的是这些项目彼此相关的唯一方式,或者例如文件真正与项目和与用户相关的项目或类似的东西相关,这样分割这些联接表更具逻辑意义
如果您要查询此主键中的各个列,这可能会告诉我您的架构不完全正确。至少您可能需要在这些列上添加单个索引以支持此类查询。
答案 2 :(得分:0)
你会后悔创建一个复合主键,解决单个行变得非常讨厌,MySQL中的派生索引必须包含主键作为行标识符。不过,你可以创建一个UNIQUE
复合词。
您可以拥有一个包含相当多组件的复合键,但请记住,您添加的越多,索引将获得的越大,执行INSERT
时更新的速度就越慢。随着数据库大小的增加,插入操作可能会变得非常缓慢。
这就是为什么,只要有可能,您应该尝试最小化索引大小。