MySQL 用 LIMIT offset, length 进行分页。但当表记录数很大,会发现大页数的查询时间明显比小页数的查询时间大。
MySQL并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回 N 行,当 offset 特别大的时候,效率就非常的低下
解决方式一:在业务上限制总页数。
解决方式二:借助索引,快速定位。
方式二是比较常用的。
示例:device_version_stat 表记录数很大,如果需要把该表的数据导出到 excel ,后面的数据查询会相对慢。如果是按 id 降序,可以借助 id 主键先快速定位到查询范围,
第一页的 maxId = null,第二页的 maxId = 具体的某个值1,第二页的 maxId = 具体的某个值2,...
在查询时带上以下条件,查询效率就会高很多,
<if test="@Ognl@isNotEmpty(minId)">
AND id > #{minId}
</if>
<if test="@Ognl@isNotEmpty(maxId)">
AND id < #{maxId}
</if>