Mysql分表后如何实现排序分页查询?

比如有一张订单表,订单id是通过雪花算法生成的,将其作为分片字段进行分表,假如分5张表,每个订单被分到第(订单id % 5 + 1)张表中,现在需要通过对订单的生成时间进行降序排序,并分页展示,需如何实现?

个人查阅资料后了解其中两种方法:

  1. 一种是比如每页10条记录,查询第三页的数据,即在单表中是limit 20,10,那么分表之后,需要每个表都查询前30条记录,总的就是150条记录,在内存中对这150条记录进行排序,取第21 - 第30条记录
  2. 另一种是禁止跳页查询,通过上一页的最大订单生成时间作为查询条件来查询,如 where ctime > 上一页的最大订单生成时间 limit 10

但是这两种方法都有缺陷,第一种随着页数的增加,查询的效率以及占用的内存将会随之增加,比如要查询第10页的数据,那么每个表都需要查询前100条的记录,总的就是500条并需要进行排序。第二种的缺点就是无法跳页查询。

是否存在一种方案可以不查询那么多数据,也可以跳页查询?

阅读 3.7k
2 个回答

不存在. 使用了分表的优点, 就要接受它的缺点.

你的表结构应该都是一样的,可以通过多表查询的方式解决,一次性查询五张表。

我不明白你为什么不使用分区呢?既有分表的优点,维护还方便,又不需要自己控制,同时能够避免你想联表查询的分页问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题