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框架Bee的SerialUniqueId,
连续单调递增全局唯一的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返回。