如何在MySQL中将主键替换为具有自动生成值的新列



我有一个表merchants,下面有列:name, program_id, program_name。当前主键为name + program_id

我需要做的是添加一个新列id,用自动生成的值(最好是uuid或类似的值(填充它,并使它成为一个新的主键。

如何做到这一点?

ALTER table merchants DROP PRIMARY KEY, ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

如果您的数据库引擎是innodb,我建议您使用自动递增整数作为主键,而不是uuid,因为innodb中的主键是聚集索引。自动递增primaryk键可以减少页面分割。

请注意,插入带有UUID主键的行不仅需要更长的时间,而且生成的索引也要大得多。其中一部分是由于主键较大,但另一部分无疑是由于页面拆分和由此产生的碎片。

和连续使用主键的缺点:

  • 目标页面可能已被刷新到磁盘并从缓存中删除,或者可能从未被放入缓存中,在这种情况下,InnoDB必须找到它并从磁盘中读取它,然后才能插入新行。这会导致大量随机I/O
  • 当插入操作无序时,InnoDB必须频繁地拆分页面,为新行腾出空间。这需要移动大量数据,并修改至少三页而不是一页
  • 由于拆分,页面变得稀疏且不规则,因此最终的数据是碎片化的

如果你想了解更多关于主键对页面拆分或页面合并的影响,你可以访问这里

最新更新