gpt4 book ai didi

mysql - 主键中的间隙会减慢查询速度吗?

转载 作者:行者123 更新时间:2023-12-01 13:15:43 24 4
gpt4 key购买 nike

我有一个 MySQL 表,其中 id是主键并自动递增。

因为我有一个使用 ON DUPLICATE KEY 每分钟运行一次的 cron 作业(从外部 API 更新统计信息) ,我在 id 中发现了很多空白柱子。我有一个列设置为唯一的,显然这就是造成差距的原因。

例如,只有 183 行,但对于 id,我已经在 71511 处了。柱子。

我运行的唯一 SELECT 查询与此类似:
SELECT * FROM table WHERE member = '123' ORDER BY id DESC LIMIT 30
我不在乎这个数字会很快变高,而且在其他任何地方都没有使用。我只是想知道它是否会导致查询随着时间的推移变慢。

例如,如果我有一个包含 100,000 行的表,但 id是十亿,差距会导致插入或选择运行更慢吗?

最佳答案

不,差距在那里因为 通过这种方式计算唯一标识符,可以更快、更容易地处理并发系统。

你的auto_increment的值是否为1755131与性能目的无关。

存储要求由您的表定义,自动增量最常用的存储标识符是 4 字节 int .无论您存储什么数字,它都会占用 4 个字节(当然,如果它可以容纳 4 个字节)。

之所以会出现差距以及为什么它们不是问题是有原因的。 Primary key是唯一标识符。计算唯一标识符的最简单方法是每次更改表(插入、删除)时增加一个数字。

这个号码不需要是 连续 但是 唯一 . MySQL 使用顺序算法来计算唯一的数字。

由于 MySQL 在运行时考虑了并发性,因此每个事务都是隔离的(如果使用事务引擎)。如果事务导致对 auto_increment 的更改但未能写入 - auto_increment 将永远使用。每个表都有一个计数器,没有代码检查数字是否应该下降(这是一种资源浪费)——它只会上升,无论查询是否成功。

这种方法保证:

  • 性能 - 无需担心计数器的状态(是否应该下降)
  • 唯一性 - 这是计算行唯一标识符的最快和最安全的方法 - 只需将数字增加 auto_increment_offset .无需担心碰撞等等。如果您将最后一个数字增加 auto_increment_offset,您 100% 确定- 你在你的数据库中得到一个新的、唯一的和未使用的号码/

  • 对于数据库,尤其是 MySQL - 在写入或读取性能方面存在多种因素。最小化并尝试摆弄 auto_increment不是其中之一。如果你保持原样,你会没事的。

    如果您认为将超过 4 字节无符号整数的最大值(约 42 亿),您可以考虑将主键更改为 bigint .如果您每秒插入数千条记录,则在几千年内不会超过该值。

    关于mysql - 主键中的间隙会减慢查询速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55303031/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com