将许多客户端中的许多小记录插入到InnoDB表中的性能特征是什么,其中插入都发生在主键的末尾(例如,使用UUID,其中前导数字基于时间戳)整个主键(例如,UUID,其中前导数字不是基于时间戳)?一个人比另一个好吗?
答案 0 :(得分:1)
首选将键附加到索引的末尾,因为索引不需要重新排序。
在主键索引的中间插入行时,由于实际表数据与InnoDB中的主键存储在同一页面上,因此必须重新排序页面数据(如果页面填满,则重新定位)。 MySQL确实为每个页面留下了增长空间,但是一些重新排序和重新定位是不可避免的。
InnoDB中的页面大小为16K,因此如果插入的行很小,效果会更差。
将行追加到索引的末尾也需要更少的锁,尽管可能存在更多争用。尝试在同一语句中插入多行。
追加也会减少磁盘上的碎片,因此顺序页面可以更紧密地结合在一起。但是,磁盘碎片并不重要,除非您查询大量连续行或执行表扫描而不是使用索引。
我不会创建增量代理主键,因此您可以按顺序插入行,除非您的写入(插入)数量高于您的读取数(或者可能因为您的行很大并且您遇到了性能问题)。如果您的读取高于您的写入,则能够使用自然主键可能会带来巨大的性能优势。
追加效果更高,但您应该考虑所有因素来选择您的方法。