mysql - 更好的 PK 用于 future 安全的数据密集型数据库

标签 mysql database

我们在为新的数据密集型项目设计主键时遇到了技术难题。

请向我们解释哪种 PK 设计更适合我们的数据密集型数据库。

  1. 数据库是数据密集型和持久性的。
  2. 每秒至少有 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/

相关文章:

sql - 如何比较表中的数据(操作前后)?

mysql - 如何在MySQL中获取MAX(速度)的时间值?

php MySQL 检索数据时出错

mysql - MySQL如何根据列将一个数据库表分成两个表

mysql - 当没有 "having"子句时, "where"和 "group by"是否完全等价?

python - 在 python 中保存大型对象图并附加到它的更有效的方法

mysql - 表达式需要靠近左连接...我在这个查询中哪里错了

python - 使用 raw_input 将 Python 的值添加到 Mysql

php - 为什么我的 $_GET 表单不能将数据(使用 PHP)插入到 MySql 数据库或表中?

mysql - SQL 查询查找跨表的最新事件