If index records are inserted in a sequential order (ascending or descending), the resulting index pages are about 15/16 full. If records are inserted in a random order, the pages are from 1/2 to 15/16 full.
为什么插入会导致大量带有随机PRIMARY KEY列的页面拆分(1/2满)?
非常感谢您的帮助.
解决方法:
MySQL不会在每次插入时“重建”索引.
MySQL的默认页面大小为16K.它以1MB的增量(称为扩展区)分配这些页面.
第一次创建表(重建索引)时,页面将被填满15/16,为一些随机插入(1k的空间)留出了空间.如果您的索引条目每个为500字节(聚集索引的主键大小行数据),则在拆分页面之前会留出空间来插入2个新行.
MySQL将最高和最低记录的值保留在页眉中,因此,一定范围内的记录将位于同一页上.
当MySQL需要在整页上插入一行时,必须拆分该页. MySQL将添加一个新页面,并将页面数据的一半移至新页面.
在页面内,记录实际上可能不是物理顺序的.它们将按照插入的顺序排列.它们通过链接列表的形式顺序链接.因此,即使是随机插入,也不需要拆分页面,也不会导致数据在物理上移动.
多次随机插入后,您的页面将从1/2满到满.具有半个完整页面的索引会对读取性能产生负面影响(您必须读取两个半完整页面才能读取与一个15/16个完整页面相同数量的记录).
现在,如果您要按索引顺序插入行,则MySQL只会继续添加到页面的末尾,将它们填满15/16,并在每次页面添加一个范围.由于不存在页面拆分,因此性能损失要少得多,因此不涉及数据移动,更不用说几乎整页的读取性能优势.
随机插入还会增加页面的碎片,如果您经常读取大量顺序记录(稀有),则可能会影响读取性能.
标签:mysql,database
来源: https://codeday.me/bug/20191121/2054335.html