【问题标题】:MySQL InnoDB Primary Key with Many Columns具有多列的 MySQL InnoDB 主键
【发布时间】:2014-02-10 18:13:44
【问题描述】:

有一个表包含比真实数据数据更多的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 个甚至更多就可以了吗?根据MySQL:“所有存储引擎都支持每张表至少16个索引,总索引长度至少256字节。大多数存储引擎都有更高的限制。”,所以我知道至少可以做到。

除此之外,还有针对这些 id 的各种组合的频繁查询。例如,查找用户 X 的所有项目,查找用户 X 的所有文件,查找项目 Y 和文件夹 Z 的所有文件等。每个 id 列上是否应该有单独的单独索引键,或者是否存在复合索引已经包含所有列的主键是否会使进一步的单个键变得多余?表中随时会有大约 1000 万到 5000 万行。

总结一下:是否可以有一个包含 4 个(或更多)id 列的复合主键,如果有一个复合键,是否会使这些列中的每一个的额外单独的键变得多余?

【问题讨论】:

  • 据我所知,没有什么会让 n 列主键成为一个坏主意,只要它有助于保持数据规范化。除此之外,我将为where 条件最多的字段创建单独的索引。

标签: mysql innodb database-schema


【解决方案1】:

是的,可以有一个包含 4 列或更多列的复合主键。

它并不一定要为这些列中的每一列增加额外的键。例如,key (a, b, c) 对查询 SELECT ... WHERE b = 4 没有用处。对于这种类型的查询,您宁愿使用key (b)key (b, c)

您需要检查预期的查询以确定您需要哪些索引。更多详情请参阅此演讲:http://youtu.be/AVNjqgf7zNw

【讨论】:

    【解决方案2】:

    是的,如果数据模型支持,这是可以的。您没有分享太多关于您的整体数据库架构以及这些项目如何相互关联以确定这是否可能被认为是最佳方法的信息。换句话说,这真的是这些 for 项目相互关联的唯一方式,或者例如文件是否真的与项目相关,以及与用户相关的项目或类似的东西,拆分这些连接表更符合逻辑意义.

    如果您要查询此主键中的各个列,这可能会向我暗示您的架构不太正确。至少您可能需要在这些列上添加单独的索引来支持这样的查询。

    【讨论】:

    • 更有可能需要更多的具有不同顺序的列的复合索引,而不是单独列上的索引:但是,这当然取决于人们希望执行的确切查询。
    • @eggyal 绝对正确。了解访问模式是这里的关键,并且在评估时可能表明不同的模式更合适。
    【解决方案3】:

    你会后悔创建复合主键,在 MySQL 中处理单个行和派生索引必须包含主键作为行标识符,这变得非常令人讨厌。不过,您可以创建一个复合的UNIQUE

    您可以拥有一个包含大量组件的复合键,但请记住,您添加的越多,索引就会变得越大,并且当您执行 INSERT 时更新速度就越慢。随着数据库大小的增长,插入操作可能会变得非常缓慢。

    这就是为什么您应该尽可能减少索引大小。

    【讨论】:

    • 我认为这个答案可能至少需要一点限定:例如,如果组成列的 codomain 的笛卡尔积中的每个可能值都存在(在大多数现实世界场景中不太可能),那么4 x 4 字节值的组合(在索引大小或性能方面)不会比任何其他 PK 设计的更差。
    • 没有人在数据库中存储几个 undecillion 数字,它只是没有发生。这个数字非常大,没有一台计算机会存储这么多数据。请记住,更大的 PK 会导致更大的索引。保持你的 PK 尽可能小。 INT 更可取,除非你真的、绝对需要 BIGINT
    • 没关系。我认为这只是一个真正喜欢创建复合主键的人。 Postgres 有一个内部行标识符,用于使它们紧凑的二级索引。无论出于何种原因,MySQL 都会为此目的使用主键,即使主键很大。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2021-11-03
    • 2012-12-14
    • 2010-09-26
    相关资源
    最近更新 更多