MySQL在使用默认存储引擎InnoDB的情况下,绝大多数情况下建议使用自增主键。需要注意的是,InnoDB有一个特性,默认会设置主键为聚簇索引。
1、性能
自增主键能保证数据行是顺序写入的,批量插入快,关联操作性能好。
UUID是不连续的,且值分布范围非常大。UUID作为聚簇索引会使索引的插入完全随机,导致大量的随机I/O;并产生大量的页分裂操作,导致大量数据移动,产生很多额外开销。
2、存储成本
一方面,自增主键顺序写入,当前主键页达到最大填充因子(InnoDB默认为15/16,留出空间以后修改)后会向新的页写入记录,可以避免碎片化从存储空间;而UUID主键不连续、随机写入的特点造成的频繁的页分裂,会导致页变得稀疏,产生不规则的数据填充问题,最终导致碎片化的存储,增加存储成本。
另一方面,一般来说UUID比自增主键字段更长,需要更大的空间存储;同时,二级索引会存储主键列,这也会增加存储成本。
3、并发争用
自增主键也有不太好的方面。高并发场景下,自增主键的下一个值可能会被不同线程争用。这种情况下可以通过设置参数innodb_autoinc_lock_mode来适配不同场景。
版权声明:本文为weixin_38569499原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。