我有一个 ID 列设置为 bigint auto_increment 的大表。在历史的某个时候,我们决定在客户端生成 ID 作为一些伪随机数。
我的问题很简单:鉴于表列仍设置为 auto_increment,即使我们总是在 INSERT 查询中提供 ID,这是否会对性能产生负面影响?这很重要/我应该费心更改架构吗?这张桌子非常大而且很忙,如果没有停机时间,恐怕我无法做到这一点。
我有一个 ID 列设置为 bigint auto_increment 的大表。在历史的某个时候,我们决定在客户端生成 ID 作为一些伪随机数。
我的问题很简单:鉴于表列仍设置为 auto_increment,即使我们总是在 INSERT 查询中提供 ID,这是否会对性能产生负面影响?这很重要/我应该费心更改架构吗?这张桌子非常大而且很忙,如果没有停机时间,恐怕我无法做到这一点。
相信数据库会在大多数情况下为您提供“最好的”。有很多代码(至少在 InnoDB 中)可以AUTO_INCREMENT
快速高效地进行,即使在将多个连接插入同一个表时也是如此。
关于AUTO_INCREMENT
和本土 ID 的注意事项:
AUTO_INCREMENT
可能遭受更少的锁定延迟和死锁。SELECT LAST_INSERT_ID()
成本不高,并且与连接隔离。也就是说,避免了一类竞争条件。PRIMARY KEY
和UNIQUE
key 吗?如果是这样,那就是开销,尤其是对于INSERTs
,它必须处理所有唯一键。请提供SHOW CREATE TABLE
针对该表的主要查询(读取和写入)。这将有助于集中此问答以更好地帮助您。
要更改PRIMARY KEY
需要停机时间。(我认为即使 MySQL 8.0 的新ALTER
优化也是如此。)
从技术上讲,即使您提供自己的值,使用自动增量列仍然会对性能产生一些影响。引擎仍然必须在后台更新自增序列变量,以便在插入查询中没有提供值的情况下可以生成一个值。
如果您使用的是 InnoDB,那么在插入时也会对表应用锁,以防止重复的自动增量值。如果您想对性能表现得迂腐,您可以更改锁定设置并将其关闭。
尽管如此,这不应该对实际性能产生任何影响,因为自动增量序列是引擎可以快速访问的变量。
如果到目前为止您还没有遇到任何问题,请保持原样,因为附加记录不会降低性能。
不幸的是,有关此主题的官方信息非常有限。