分库分表Mysql分页方案优化

本文探讨了数据库分页查询的优化方法,强调了通过ID连续性进行分页的优势,并对比了雪花算法的局限性。提出了ORM框架Bee的SerialUniqueId和梨花算法作为解决方案,这两种算法能在分布式环境中生成连续、全局唯一的ID,同时减少了对时间的依赖。 SerialUniqueId具备高并发下的高效性能,而梨花算法解决了雪花算法的润秒问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql:
分页方案优化

由于LIMIT并不能通过索引查询数据,因此如果可以保证ID的连续性,通过ID进行分页是比较好的解决方案:

select * from t_order where id > 100000 and id <= 100010 order by id
或通过记录上次查询结果的最后一条记录的ID进行下一页的查询:
select * from t_order where id > 100000 limit 10
sql输出,提示是经过优化的sql.用不带分页的部分sql为key,缓存上一次查询的id.

问题是如何保证ID的连续性??????

依赖DB分段批量获取的算法,是可以产生全局唯一,且批内连续单调递增的ID。但多个请求分别调用生成一批,多个批都插入数据到库,还是不会连续的。强依赖DB。

雪花生成的是不连续,全局唯一,但只能是趋势递增的ID,部分区间连续,整体不连续。过于依赖时间。

可以选择:

ORM框架BeeSerialUniqueId,

连续单调递增全局唯一的ID生成算法SerialUniqueId:不依赖于时间,也不依赖于任何第三方组件,只是启动时,用一个时间作为第一个ID设置的种子,设置了初值ID后,就可获取并递增ID。在一台DB内与传统的一样,连续单调递增(而不只是趋势递增),而代表DB的workerid作为DB的区号放在高位(类似电话号码的国际区号),从所有DB节点看,则满足分布式DB生成全局唯一ID。本地(C8 I7 16g)1981ms可生成1亿个ID号,利用上批获取,分隔业务,每秒生成过10亿个ID号不成问题,能满足双11的峰值要求
 

 梨花算法:改进的雪花算法,弱依赖时间,可以轻松避免润秒问题。workerid默认从配置文件获取,代码架构可方便扩展workerid分配算法,能处理workerid冲突问题。可提前消费1秒。。。

返回结果用原生long返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值