有一个流程图,它不分为数据库和表。当前数据量为950W。此限制用于分页查询。优化前查询时间约167s(执行16s831ms,取数107ms)。按以下方式调整SQL后,时间为347ms(执行:163ms,取数:184ms)。优化前的SQL类似于:
优化后的SQL如下(这种优化方法在高性能MySQL中提到过):
首先,解释一下MySQL版本:
让我们再看看表结构:
ID是自动递增主键,Val是索引。
大量数据涌入,总计500万:
我们知道,当limitoffsetrows中的偏移量较大时,将存在效率问题:
为了达到同样的目的,我们一般会重写如下:
找到索引叶节点数据。根据叶节点上的主键值,在聚集索引上查询所有必需的字段值。
类似于下图:
有人会问:既然索引是在开头使用的,为什么不先查询索引叶节点的五个节点,然后查询聚集索引中的实际数据。这样,只需要5个随机I/O,类似于以下过程:
现在让我们在实践中确认上述推论:
我只能间接地证明:
如您所见,目前缓冲池中没有关于测试表的数据页。
可以看出,此时缓冲池中的测试表有4098个数据页和208个索引页。
运行SQL:
为了确保每次重新启动数据库时都清空缓冲池,我们需要在关机时关闭InnoDB缓冲池转储,在启动时关闭InnoDB缓冲池加载。这两个选项可以在数据库关闭时控制缓冲池中的数据,在数据库打开时控制磁盘上加载的数据。