本文最后更新于 2024-07-11,文章内容可能已经过时。

描述


select * from table limit 500000,50 比较大的值,MySQL会对前面的数据进行读取和放弃,导致性能较差

  • 加限制条件

比如 select * from table where id > #{id} order by id desc limit 50

这里可以通过记住上一页的最后一条记录的某个唯一标识符(如ID),并在下一页查询时使用这个标识符作为起点。

也可以使用ID范围来替代OFFSET。例如,如果你知道上一页的最后一条记录的ID是1000,你可以查询ID大于1000的记录,并限制返回的记录数。

  • 通过子查询加限制,select * from table where id in (select id from table order by id desc limit 500000,50)

因为子查询走的是覆盖索引,子查询只用到了索引列,如果索引在内存中就直接走内存中的索引,如果不在,如innodb,则会去查找data下的.ibd文件,根据当前查找模式和内存,考虑部分加载到内存中,快速定位数据在磁盘中的位置,然后进行返回,尽管offset比较大,查询效率也不会太低。