大数据量分页优化
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。
-
最常用的方法,limit offset, rows
比如:select * from users limit 0, 10;
,当起始页小或者数据量小的时候没有问题,因为要扫描的行数少。
但是如果数据表数据几百万行,然后要展示上千上万页的数据的时候,这个时候所需的时候就成倍增长。 -
分页之前找到上次最后一条的相关ID进行过滤后再limit。
上一页最后的userId是1000000,那么给当前页传入上一页的userId,然后当前页的分页就是:select * from users where userId>1000000 limit 10;
-
利用子查询覆盖索引来优化
覆盖了索引就不需要回表查询数据,所以很快的。比如:
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
反正类似的,就是子查询覆盖索引,然后减少外层查询的扫描行数。