MySQL中INT和UUID的区别

孙为强*_*孙为强 19 mysql performance primary-key

如果我设置主键INT类型(AUTO_INCREMENT)或将其设置在UUID,有什么这两者之间的数据库性能(差异SELECT,INSERT等等),为什么?

Nik*_* M. 31

UUID返回一个通用的唯一标识符(如果导入到另一个DB,也希望也是唯一的).

引用MySQL doc(强调我的):

UUID被设计为在空间和时间上全球唯一的数字.对UUID()的两次调用预计会生成两个不同的值,即使这些调用是在两个彼此 未连接的独立计算机上执行的.

另一方面,简单的INT主id键(例如AUTO_INCREMENT)将返回特定DB和DB表的唯一整数,但这不是普遍唯一的(因此,如果导入到另一个DB,则可能存在主键冲突).

在性能方面,使用auto-incrementover 不应有任何明显的差异UUID.大多数帖子(包括本网站作者的一些帖子)都是这样说的.当然UUID可能需要更多的时间(和空间),但这不是大多数(如果不是全部)情况的性能瓶颈.有一个列Primary Key应该使两个选择与性能相等.见下面的参考:

  1. UUID不是UUID
  2. 神话,GUID对比Autoincrement
  3. 性能:在cakephp-mysql中的UUIDvsauto-increment
  4. UUID 在MySQL中的表现?
  5. 主键:IDs与GUIDs(编码恐怖)

(UUIDvs auto-increment性能结果,改编自Myths,GUIDvsAutoincrement)

在此输入图像描述

UUID优点/缺点(改编自主键:IDs与GUIDs)

GUID 优点

  • 每个表,每个数据库,每个服务器都是唯一的
  • 允许轻松合并来自不同数据库的记录
  • 允许跨多个服务器轻松分发数据库
  • 您可以ID在任何地方生成s,而不必往返数据库
  • 大多数复制方案GUID无论如何都需要列

GUID 缺点

  • 它比传统的4字节索引值大4倍; 如果你不小心,这可能会产生严重的性能和存储影响
  • 调试很麻烦(where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • 生成的GUIDs应该是部分顺序的以获得最佳性能(例如,newsequentialid()在SQL 2005上)并且能够使用聚簇索引.


注意

我会仔细阅读上面提到的参考文献,并UUID根据我的用例决定是否使用.也就是说,在许多情况下,UUIDs确实更可取.例如,一个人可以UUID在不使用/访问数据库的情况下生成s,或者甚至使用UUID已经预先计算和/或存储在其他地方的s.此外,您可以轻松地概括/更新数据库架构和/或群集方案,而无需担心ID破坏和导致冲突.

  • Con:如果缓存对于整个UUID索引来说不够大,那么性能将会耗费大量时间. (2认同)