比如有一张订单表,订单id是通过雪花算法生成的,将其作为分片字段进行分表,假如分5张表,每个订单被分到第(订单id % 5 + 1)张表中,现在需要通过对订单的生成时间进行降序排序,并分页展示,需如何实现?
个人查阅资料后了解其中两种方法:
- 一种是比如每页10条记录,查询第三页的数据,即在单表中是
limit 20,10
,那么分表之后,需要每个表都查询前30条记录,总的就是150条记录,在内存中对这150条记录进行排序,取第21 - 第30条记录 - 另一种是禁止跳页查询,通过上一页的最大订单生成时间作为查询条件来查询,如
where ctime > 上一页的最大订单生成时间 limit 10
但是这两种方法都有缺陷,第一种随着页数的增加,查询的效率以及占用的内存将会随之增加,比如要查询第10页的数据,那么每个表都需要查询前100条的记录,总的就是500条并需要进行排序。第二种的缺点就是无法跳页查询。
是否存在一种方案可以不查询那么多数据,也可以跳页查询?
不存在. 使用了分表的优点, 就要接受它的缺点.