我们在为新的数据密集型项目设计主键时遇到了技术难题。
请向我们解释哪种 PK 设计更适合我们的数据密集型数据库。
- 数据库是数据密集型和持久性的。
- 每秒至少有 3000 个用户访问它。
请从技术上告诉我们哪种类型的 PK 更适合我们的数据库,并且这些表将来更改的可能性较小。
1.INT/BIGINT自增列作为PK
2.复合键。
3.唯一的varchar PK。
最佳答案
我会选择选项 1,使用 BIGINT 自动增量列作为 PK。原因很简单,每次写都会写到当前页的末尾,意味着插入新行非常快。如果你使用组合键,那么你需要一个顺序,除非你是按照组合键的顺序插入,否则你需要分页插入,例如想象一下这张表:
A | B | C
---+---+---
1 | 1 | 4
1 | 4 | 5
5 | 1 | 2
其中主键是(A, B, C)上的复合键,假设我要插入(2, 2, 2),则需要插入如下:
A | B | C
---+---+---
1 | 1 | 4
1 | 4 | 5
2 | 2 | 2 <----
5 | 1 | 2
这样聚簇键保持其顺序。如果您已经插入的页面也已经满了,那么 MySQL 将需要拆分该页面,将一些数据移动到新页面以为新数据腾出空间。这些页面拆分的成本非常高,因此除非您知道要插入顺序数据,否则使用自动增量列作为聚类键意味着除非您弄乱了增量,否则您永远不必拆分页面。
您仍然可以向将作为主键的列添加一个唯一索引以保持完整性,您仍然会遇到与索引拆分相同的问题,但是由于索引会比聚集索引窄,因此拆分会由于更多数据将适合页面,因此频率较低。
或多或少相同的论点适用于唯一的 varchar 列,除非你有某种过程确保 varchar 是连续的,但生成连续的 varchar 比自动增量列的成本更高,我看不出直接的优势.
关于mysql - 更好的 PK 用于 future 安全的数据密集型数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741085/