mysql - 分布式 RDBMS 中的唯一键

标签 mysql database

想象一下,有一个关系数据库系统(比如说 MySQL),它集群在许多服务器(可能有 100 台服务器)中。在这个数据库系统中有一个名为“users”的表,“users”包含一个主键(例如UINT)。

该用户 ID 在所有服务器中必须是唯一的。该用户 ID 可以自动递增。

那么分布式数据库系统如何处理这些类型的问题呢? RDBMS 如何生成在所有服务器中唯一的唯一索引?

我不需要任何有关如何在 MySQL 中执行此操作的 SQL 代码,我只需要知道在这种情况下它是如何完成的。

[编辑]

两个答案听起来都不错。

这是另一种情况,我们以StackOverflow为例。此问题网址为 http://stackoverflow.com/questions/18359434。另一个URL是http://stackoverflow.com/questions/18359435,它指向这个问题之后提出的问题。显然 stackoverflow 有多个数据库服务器。但问题的 ID 是自动递增的。

那么 StackOverflow 使用的方法是什么?

StackOverflow 获得了大量流量,Alexa 和 Quantacast 排名均约为 100。

最佳答案

规范的解决方案是使用 uuid() (请参阅 here )而不是整数作为此类唯一标识符。这保证在空间和时间上都是唯一的。

更“黑客”的解决方案是使用两部分主键。第一个是“我所在的系统”的标识符,第二个是一个自动递增的数字,该数字是该系统唯一的。

另一个“黑客”解决方案是给每个系统范围。假设您使用的是大整数,那么在一个系统上可能以 1,000,000,000 开始该值,在另一个系统上可能以 2,000,000,000 开始,依此类推。

我不建议您实际尝试在分布式系统中实现自动递增的数字。这基本上需要有一个系统来维护最新的号码,并让其他系统询问下一个号码。无论您如何实现这一点,都会给系统带来瓶颈。

关于mysql - 分布式 RDBMS 中的唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18359434/

相关文章:

php - 在真表的行中循环

php - 如何汇总引用另一个表的 2 列中的数据并获取过去 3 个月的每月总计?

php - 按降序对表记录进行排序 - symfony

mysql - 不使用主键时 MySQL 中的 UPSERT

php 从 mysql 导出 csv

ios - 显示数据库中的数据 - CoreData 如何走?

mysql - 在mysql中的new/old.colname中添加引号?

php - 根据价格给出 0 到 10 的平均评分

java - 如何一起执行2个查询?

java - Hibernate 选择和插入奇怪的行为