将来自多个客户端的许多小记录插入到 InnoDB 表中的性能特征是什么,其中插入全部发生在主键的末尾(例如,使用 UUID,其中前导数字基于时间戳)与分散的性能特征是什么整个主键(例如,UUID 的前导数字不基于时间戳)?其中一个比另一个更可取吗?
最佳答案
首选将键附加到索引末尾,因为索引不需要重新排序。
当在主键索引中间插入行时,由于InnoDB中实际的表数据与主键存储在同一页上,因此必须对页数据重新排序(如果页满了则重新定位)。 MySQL 确实为每个页面留有增长空间,但一些重新排序和重新定位是不可避免的。
InnoDB 中的页面大小为 16K,因此如果插入的行较小,效果较小。
将行追加到索引末尾也需要更少的锁,但可能会出现更多争用。尝试在同一个语句中插入多行。
追加还会减少磁盘上的碎片,因此连续的页面可以保持更紧密的联系。然而,磁盘碎片并不重要,除非您正在查询大量连续行或执行表扫描而不是使用索引。
我不会创建增量代理主键,以便您可以按顺序插入行,除非您的写入(插入)次数高于读取次数(或者可能是因为您的行很大并且遇到性能问题)。如果您的读取高于写入,则能够使用自然主键可能会带来巨大的性能优势。
附加的性能更高,但您应该考虑所有因素来选择方法。
关于mysql - 最好是在 InnoDB 主键末尾插入,还是分散插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22486278/