*跳至粗体文字以减少解释
我一直在阅读一些关于使用UUID / GUID与主键(或唯一约束)的自动递增整数(例如this one和UUID performance in MySQL?)的优缺点的文章和主题
我的方案是:客户生成一个必须唯一的订单。客户端通过半坏wifi或3G向PHP处理请求的Web服务器发送命令,将命令插入数据库并告知客户端一切顺利。客户端刷新缓存并开始使用新订单重新构建它,直到它可以再次清空,这通常是即时的,但这与问题无关,即:
"半坏wifi或3G" -part,因为在客户端未成功通知订单插入成功的情况下,这有时会导致数据库中出现重复的订单条目,并且重试相同的顺序。
数据库当然只是使用新的PK自动增加相同的顺序,因此只有auto_increment的解决方案不起作用。
我目前的解决方案是客户端注册了一个唯一的ID(只是整数),当客户端注册为客户端时,该ID由服务器发出。然后客户端通过从1开始直到每个订单的结束时间来执行自己的auto_increment。 orders-table然后有一个复合唯一索引,由两个整数行组成,一个用于客户端ID,另一个用于客户端自己的订单ID。
目前这种方法有效,但我有两个问题:
所以,我的新解决方案是生成UUID / GUID客户端并使用它们来防止重复插入。然后我得出结论,与使用auto_increments相比,GUIDs最终会随着表的增长而严重影响插入性能。为了防止这种负面影响,我想到了以下几点,实际问题:
由于所有订单都是按日期标记的,并且日期只会插入如此多的订单(在此系统中每天很少超过一千),而且我并不关心将GUID用作标识符或用于合并目的 - 我打算将auto_increment整数保持为PK和订单标识 - 将日期与GUID结合起来是个好主意,日期是索引的第一部分吗?据我所知,数据库只需要检查每个日期的GUID,因为客户端每次尝试插入订单时都会提供日期和GUID:
客户将提供订单,订单的订单,详细信息,其他任何信息,日期和GUID。如果服务器已经具有日期和GUID,它将忽略插入并让客户端知道插入成功。我知道这会起作用,但从长远来看这是否可行,与使用仅具有GUID的单个唯一索引相比如何?服务器不必为每个插入查看更多数据如果它不能按日期阻止数据?
此外,这还具有额外的理论优势,即每个日期只有重复GUID的风险。而且我知道这在现实世界中并不重要,但它让我安心。