使用limit的深度分页,查询比较缓慢怎么办。
数据表 比较大了 有1000万条数据了 查询分页非常慢 使用模型查询怎么优化 分页查询呀? 输出的是API json数据
$users = User::query()->where('type',1)->simplePaginate(100);
select * from users where `type`=1 limit 100000,100
模型查询怎么优化分页查询呀? 让分页查询速度更快一些
这种情况一般不允许无限分页了,只展示最近的 N 条,如 id > 最大id - 100000,分页器的 total 数量也直接写死
类似于分段。我们给每次只能翻100页、超过一百页的需要重新加载后面的100页。这样就解决了每次加载数量数据大 速度慢的问题了
select * from table_name Where id > 最大id limit 10000, 10; 这种方法适用于:除了主键ID等离散型字段外,也适用连续型字段datetime等 最大id由前端分页pageNum和pageIndex计算出来
这种一般是计算总数量的时候,速度缓慢。建议使用
forPage
直接获取。然后每次请求都是传第几页,一直到下一页没数据了,表示数据已经请求完成,这种分页查询方式会从数据库第一条记录开始扫描,所以越往后,查询速度越慢.所以你得跳过前 10万条.
Where id > 100000
,不过实际业务会有查询条件,所以得用子查询加上查询条件找这个ID
的值除了楼上的思路,还要就是可以上ES等存储检索引擎,检索后回表重新取出数据
不改业务需求的话,无解!
首先要锁死最多查多少条多少页,不允许无限分页
如果一定要查的话,那么加上主键id,比如上一次查询主键id是 10000000,那么你就是 where id > 10000000 limit 100
升序降序的话自己改where条件就好了
查询的时候 可以带上id 比如id倒叙排列
where('id','<',$min_id)
可以利用覆盖索引减少一些查询时间。
方案一
方案二
当使用limit进行分页时,查询可能会变得缓慢,这通常是因为limit需要查询整个表然后再返回所需的部分。,可以尝试使用下面的方法来提高查询的效率。
让用户条件筛选缩小范围 不允许 这种查询行为 :see_no_evil: