mysql - 最好是在 InnoDB 主键末尾插入,还是分散插入?

标签 mysql performance innodb

将来自多个客户端的许多小记录插入到 InnoDB 表中的性能特征是什么,其中插入全部发生在主键的末尾(例如,使用 UUID,其中前导数字基于时间戳)与分散的性能特征是什么整个主键(例如,UUID 的前导数字不基于时间戳)?其中一个比另一个更可取吗?

最佳答案

首选将键附加到索引末尾,因为索引不需要重新排序。

当在主键索引中间插入行时,由于InnoDB中实际的表数据与主键存储在同一页上,因此必须对页数据重新排序(如果页满了则重新定位)。 MySQL 确实为每个页面留有增长空间,但一些重新排序和重新定位是不可避免的。

InnoDB 中的页面大小为 16K,因此如果插入的行较小,效果较小。

将行追加到索引末尾也需要更少的锁,但可能会出现更多争用。尝试在同一个语句中插入多行。

追加还会减少磁盘上的碎片,因此连续的页面可以保持更紧密的联系。然而,磁盘碎片并不重要,除非您正在查询大量连续行或执行表扫描而不是使用索引。

我不会创建增量代理主键,以便您可以按顺序插入行,除非您的写入(插入)次数高于读取次数(或者可能是因为您的行很大并且遇到性能问题)。如果您的读取高于写入,则能够使用自然主键可能会带来巨大的性能优势。

附加的性能更高,但您应该考虑所有因素来选择方法。

关于mysql - 最好是在 InnoDB 主键末尾插入,还是分散插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22486278/

相关文章:

python - 使用 .loc 访问器的 pandas 日期时间索引的 bool 掩码

mysql - Rails 4 - 从 SQLite 切换到 MySQL - 无法添加外键约束

MySQL 5.6 - InnoDB - DATA_FREE 未使用,但表不断增长

php - 更新 php-mysql 中的表

mysql - 在Mysql中搜索相似的字符串

mysql - 单个查询获取多个日期的数据

执行存储过程时 PHP Apache 崩溃

c - 我们可以多快做出特定的 tr?

javascript - 使用 $(this).scrollWidth 获取实际宽度非常慢

mysql - 表模式中 AUTO_INCRMENT=20018215 的含义是什么