如何将过亿订单数据实现毫秒级分页查询

注:以下sql及数据库截图均为测试数据,无实际用途!

分页查询???
难道不是 limit pageId,pageSize ???
在这里插入图片描述

新建测试订单表lp_bank_order,以create_day分天记录,
数据量分别为十万级、百万级、亿级测试,
分析如下:

Mysql 在使用limit pageId,pageSize时,随着数据量的增大,性能会急剧下降

select * from lp_bank_order t where t.create_day=20181014 limit 0,10;   -- 0.026
select * from lp_bank_order t where t.create_day=20181014 limit 1000,10; -- 0.032
select * from lp_bank_order t where t.create_day=20181014 limit 5000,10; -- 0.058
select * from lp_bank_order t where t.create_day=20181014 limit 10000,10; -- 0.085
select * from lp_bank_order t where t.create_day=20181014 limit 50000,10; -- 0.248
select * from lp_bank_order t where t.create_day=20181014 limit 100000,10; -- 0.451

那么问题来了,必然随着数据增多,瓶颈会越来越大?
如何实现过亿数据的分页查询,就成了一个问题!!!

在这里插入图片描述

常规思想行不通
转换思路!!!

  • 解决思路1
    Limit pageId, pageSize有瓶颈
    但是
    Limit pageSize是OK的

  • 解决思路2
    Limit pageSize是OK的,但是要取到每一段,还需要一个条件控制
    推荐如下:
    id
    create_time

所以我们诞生了如下sql:

select * from lp_bank_order t 
where 
t.create_day=20181014
and t.id > 254671932
limit 10;

在这里插入图片描述

OK,大功告成,收工走人???

细心的人已经发现…

id是无序的
在这里插入图片描述

发现问题,开启排序操作:

select * from lp_bank_order t 
where 
t.create_day=20181014
and t.id > 254671932
order by t.id ASC
limit 10;

在这里插入图片描述

走到这里,往下翻页基本搞定…

处理往上翻页~~
在这里插入图片描述

处理往上分页:

select * from lp_bank_order t 
where 
t.create_day=20181014
and t.id < 254671933
order by t.id DESC
limit 10;

在这里插入图片描述

有没有发现幺蛾子…

往上翻页因为倒序排过,返回的列表是倒序的…
在这里插入图片描述

继续改进:

select * from 
(
select * from lp_bank_order t 
where 
t.create_day=20181014
and t.id < 254671933
order by t.id DESC
limit 10
) m
ORDER BY m.id;

此时此刻,这个sql已经可以支持表内数据几百万了,查询速度刚刚滴。。。
在这里插入图片描述
新幺蛾子又出现了…

表内达到上亿数据的时候,就运行不出来了。。。
分析原因 -->
在这里插入图片描述

通过运行sql的使用索引发现,这个sql只用了主键id的索引,并没有用上create_day索引
造成了order by id的时候,是全表排序的,才会导致很慢

![在这里插入图片描述](https://img-blog.csdni

获取并缓存ID
每次查询最大最小ID需要耗时:1-2秒 所以需要缓存起来!!!
在这里插入图片描述
在这里插入图片描述

截止此时,分页查询的核心脚本已经OK…
在这里插入图片描述
我们还可以继续优化的事项:

  • 部分缓存数据现在都是首次查询的时候缓存的,可以使用脚本去提前缓存,这样首次查询一样可以享受快速查询
  • 订单查询的缓存时间虽然缩短至10秒,但是方案有待进一步去优化
    … …

最后送大家一句话:

世上没有绝望的处境,只有对处境绝望的人。 —— 费洛姆

  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值