问题描述
给定一个具有大的自动递增的整数主键的表,我想知道在具有连续或接近连续主键的多行上进行事务处理是否比在相同数目的相同事务上进行更少的磁盘IO操作具有分布更广泛的值的行。
例如:
使用主键的记录上的SELECT WHERE id IN
语句将如何:
10202、10203、10205、10207、10208、10209,与具有以下键的同一语句进行比较:7、10202、52401、28772、924、1189,假设所有记录都大大小于页面大小的1/6? / p>
解决方法
是的,如果按该顺序插入。但是,实际上,整个数据库的I / O模式是相当随机的,因此净收益可能难以最终确定。
,正如@Gordan所指出的那样,记录是按主键排序存储的。不管它们以什么顺序插入都没关系。
我想说,如果主键值是集群的,则InnoDB可能发出较少的IO请求。让我解释一下原因。
比方说,所有InnoDB页面都在磁盘上,缓冲池中没有任何内容。要拉出记录10202,InnoDB将需要读取根页面,即从所有非叶子页面到叶子页面的过程。读取的所有页面将存储在缓冲池中。
下一个读取-10203。由于所有页面都已经在缓冲池中,所以InnoDB很可能不会进行任何磁盘读取(除非10203位于相邻的叶子页面上的可能性较小)。
现在,如果InnoDB需要从索引的其他部分读取某些ID,则它将需要读取根页面(最有可能被缓存),非叶页面(其中一些最有可能被缓存)。 + tree很浅)和叶子页(未缓存)。因此,您将获得额外的磁盘读取。