组合UUID / GUID,日期和AUTO_INCREMENT

时间:2015-01-05 09:23:14

标签: mysql insert

*跳至粗体文字以减少解释

我一直在阅读一些关于使用UUID / GUID与主键(或唯一约束)的自动递增整数(例如this oneUUID performance in MySQL?)的优缺点的文章和主题

我的方案是:客户生成一个必须唯一的订单。客户端通过半坏wifi或3G向PHP处理请求的Web服务器发送命令,将命令插入数据库并告知客户端一切顺利。客户端刷新缓存并开始使用新订单重新构建它,直到它可以再次清空,这通常是即时的,但这与问题无关,即:

"半坏wifi或3G" -part,因为在客户端未成功通知订单插入成功的情况下,这有时会导致数据库中出现重复的订单条目,并且重试相同的顺序。

数据库当然只是使用新的PK自动增加相同的顺序,因此只有auto_increment的解决方案不起作用。

我目前的解决方案是客户端注册了一个唯一的ID(只是整数),当客户端注册为客户端时,该ID由服务器发出。然后客户端通过从1开始直到每个订单的结束时间来执行自己的auto_increment。 orders-table然后有一个复合唯一索引,由两个整数行组成,一个用于客户端ID,另一个用于客户端自己的订单ID。

目前这种方法有效,但我有两个问题:

  1. 随机顺序的两个整数的复合索引对插入性能的影响有多大?
  2. 在客户端回滚的情况下会发生什么,例如客户端是否从备份恢复,这会弄乱客户端自己的订单ID系统?好吧,我自己可以回答:实际订单将被视为已插入但随后被抛出(INSERT IGNORE),因为数据库会认为它已经有了它们。
  3. 所以,我的新解决方案是生成UUID / GUID客户端并使用它们来防止重复插入。然后我得出结论,与使用auto_increments相比,GUIDs最终会随着表的增长而严重影响插入性能。为了防止这种负面影响,我想到了以下几点,实际问题:

    由于所有订单都是按日期标记的,并且日期只会插入如此多的订单(在此系统中每天很少超过一千),而且我并不关心将GUID用作标识符或用于合并目的 - 我打算将auto_increment整数保持为PK和订单标识 - 将日期与GUID结合起来是个好主意,日期是索引的第一部分吗?据我所知,数据库只需要检查每个日期的GUID,因为客户端每次尝试插入订单时都会提供日期和GUID:

    客户将提供订单,订单的订单,详细信息,其他任何信息,日期和GUID。如果服务器已经具有日期和GUID,它将忽略插入并让客户端知道插入成功。我知道这会起作用,但从长远来看这是否可行,与使用仅具有GUID的单个唯一索引相比如何?服务器不必为每个插入查看更多数据如果它不能按日期阻止数据?

    此外,这还具有额外的理论优势,即每个日期只有重复GUID的风险。而且我知道这在现实世界中并不重要,但它让我安心。

0 个答案:

没有答案