大数据量分页优化

mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。

  1. 最常用的方法,limit offset, rows
    比如:select * from users limit 0, 10;,当起始页小或者数据量小的时候没有问题,因为要扫描的行数少。
    但是如果数据表数据几百万行,然后要展示上千上万页的数据的时候,这个时候所需的时候就成倍增长。

  2. 分页之前找到上次最后一条的相关ID进行过滤后再limit。
    上一页最后的userId是1000000,那么给当前页传入上一页的userId,然后当前页的分页就是: select * from users where userId>1000000 limit 10;

  3. 利用子查询覆盖索引来优化
    覆盖了索引就不需要回表查询数据,所以很快的。比如:
    select userId from users limit 1000000, 100;,因为userId是主键,所以不用回表查询数据,但是我们在查询中不可能只需要返回主键的。 如此:

    • select * from users where userId >= (select userId from users limit 1000000, 1) limit 100;
    • select * from users a inner join (select userId from users limit 1000000, 100) b on a.userId=b.userId

    反正类似的,就是子查询覆盖索引,然后减少外层查询的扫描行数。


Flag Counter