Dinesh Kumar Asked: 2018-11-22 04:15:56 +0800 CST2018-11-22 04:15:56 +0800 CST 2018-11-22 04:15:56 +0800 CST 在存储方面(在 Mysql 中)如何理解复合主键? 772 阅读这篇文章后,我可以想象行将如何作为主键顺序(例如自动增量键)在单个数据库页面中排列。但我想知道在复合主键的情况下它会如何。例如考虑一个 pk(a integer, b integer),在数据库页面中,行是按照 a 列还是 b 列排列的? mysql database-internals 2 个回答 Voted Best Answer Rick James 2018-11-22T15:08:33+08:002018-11-22T15:08:33+08:00 (这个答案侧重于 MySQL;特别是 InnoDB 引擎。JCole 的博客(您链接到的)对 InnoDB 有效,但可能过于技术性。我会尝试给出一个更轻松的答案。) 以这种方式考虑复合键...将键连接在一起,然后 BTree 结构就好像它有一个单列(尽管更大)键。 任何复合索引中指定的列的顺序都很重要。对于PRIMARY KEY(a,b),行将按以下顺序排列: a b - - 1 1 1 2 1 5 1 7 2 1 2 2 2 3 2 8 3 2 ... 这意味着,例如,这WHERE a=2将找到所有“聚集”在一起的行。但WHERE b=2会发现它们散落一地。 这里也用“Clustering”来表示数据就在同一个BTree中的PK旁边。 块结构(InnoDB 中的 16KB 块)由发生的任何事情控制。也就是说,在 (a,b) 对中没有明显的位置,即一个块结束而下一个块开始。 在 InnoDB 中,PRIMARY KEY总是与数据聚集在一起。作为副作用,该 KEY 的开销几乎为零。所有“辅助键”都是单独的 BTree,在其叶节点中具有 PK。 在上面的例子中,假设(为了简洁起见)每个 Block 只有 3 行: Block 0: (1,1),(1,2),(1,5) Block 1: (1,7),(2,1),(2,2) Block 2: (2,3),(2,8),(3,2) 请注意,中断a与块拆分无关。(此外,这个例子可能会产生误导——块很少只有 3 行;每个块不一定有相同的行数。) eroomydna 2018-11-22T12:41:23+08:002018-11-22T12:41:23+08:00 MySQL 并没有(据我所知)在这里偏离标准。很好地解释了这篇文章的答案: https ://stackoverflow.com/questions/1648217/what-does-ab-tree-index-on-more-than-1-column-look-like
(这个答案侧重于 MySQL;特别是 InnoDB 引擎。JCole 的博客(您链接到的)对 InnoDB 有效,但可能过于技术性。我会尝试给出一个更轻松的答案。)
以这种方式考虑复合键...将键连接在一起,然后 BTree 结构就好像它有一个单列(尽管更大)键。
任何复合索引中指定的列的顺序都很重要。对于
PRIMARY KEY(a,b)
,行将按以下顺序排列:这意味着,例如,这
WHERE a=2
将找到所有“聚集”在一起的行。但WHERE b=2
会发现它们散落一地。这里也用“Clustering”来表示数据就在同一个BTree中的PK旁边。
块结构(InnoDB 中的 16KB 块)由发生的任何事情控制。也就是说,在 (a,b) 对中没有明显的位置,即一个块结束而下一个块开始。
在 InnoDB 中,
PRIMARY KEY
总是与数据聚集在一起。作为副作用,该 KEY 的开销几乎为零。所有“辅助键”都是单独的 BTree,在其叶节点中具有 PK。在上面的例子中,假设(为了简洁起见)每个 Block 只有 3 行:
请注意,中断
a
与块拆分无关。(此外,这个例子可能会产生误导——块很少只有 3 行;每个块不一定有相同的行数。)MySQL 并没有(据我所知)在这里偏离标准。很好地解释了这篇文章的答案: https ://stackoverflow.com/questions/1648217/what-does-ab-tree-index-on-more-than-1-column-look-like