0

我有一个 ID 列设置为 bigint auto_increment 的大表。在历史的某个时候,我们决定在客户端生成 ID 作为一些伪随机数。

我的问题很简单:鉴于表列仍设置为 auto_increment,即使我们总是在 INSERT 查询中提供 ID,这是否会对性能产生负面影响?这很重要/我应该费心更改架构吗?这张桌子非常大而且很忙,如果没有停机时间,恐怕我无法做到这一点。

4

2 回答 2

2

相信数据库会在大多数情况下为您提供“最好的”。有很多代码(至少在 InnoDB 中)可以AUTO_INCREMENT快速高效地进行,即使在将多个连接插入同一个表时也是如此。

关于AUTO_INCREMENT和本土 ID 的注意事项:

  • AUTO_INCREMENT可能遭受更少的锁定延迟和死锁。
  • 我不会专注于优化的主键;看看别处。
  • 提供您自己的 ID 意味着您必须将其发送到服务器;这会增加(少量)带宽和延迟。
  • SELECT LAST_INSERT_ID()成本不高,并且与连接隔离。也就是说,避免了一类竞争条件。
  • 如果您向 auto_inc 列提供了一个数字,那么您将挫败它的许多优化。
  • 您是否有第二列包含您生成的 id?也就是说,你有 aPRIMARY KEYUNIQUEkey 吗?如果是这样,那就是开销,尤其是对于INSERTs,它必须处理所有唯一键。
  • “一些伪随机数”——你如何处理偶尔的重复?
  • “非常忙”是什么意思?如果这主要影响社交媒体“喜欢”的计数器,那么将该列移动到并行表(“垂直”分区)可能会提供显着的整体优化。

请提供SHOW CREATE TABLE针对该表的主要查询(读取和写入)。这将有助于集中此问答以更好地帮助您。

要更改PRIMARY KEY需要停机时间。(我认为即使 MySQL 8.0 的新ALTER优化也是如此。)

于 2019-12-18T23:54:33.593 回答
1

从技术上讲,即使您提供自己的值,使用自动增量列仍然会对性能产生一些影响。引擎仍然必须在后台更新自增序列变量,以便在插入查询中没有提供值的情况下可以生成一个值。

如果您使用的是 InnoDB,那么在插入时也会对表应用锁,以防止重复的自动增量值。如果您想对性能表现得迂腐,您可以更改锁定设置并将其关闭。

尽管如此,这不应该对实际性能产生任何影响,因为自动增量序列是引擎可以快速访问的变量。

如果到目前为止您还没有遇到任何问题,请保持原样,因为附加记录不会降低性能。

不幸的是,有关此主题的官方信息非常有限。

于 2019-12-18T13:55:43.627 回答