UUID主键的深分页如何解决?
传统的深分页优化(游标分页)核心原理是 WHERE id > 上一页最后的id 。但 UUID 是随机无序的字符串,如果直接用它做比较,查出来的数据顺序是乱的,会导致分页数据重复或遗漏。
怎么优化?(3种实战方案)
方案一:组合游标分页(最推荐,无需加字段)
利用“创建时间 + UUID”作为联合排序条件。因为时间是有顺序的,而 UUID 保证了同一时间下的唯一性。
SQL 示例:
WHERE (create_time, id) > (上一页最后的时间, 上一页最后的UUID) ORDER BY create_time, id LIMIT 10
注:必须为 create_time 和 id 建立联合索引,否则大数据量下依然很慢。
方案二:延迟关联(适合必须跳页的场景)
先用二级索引查出目标页的主键 ID,再回表查全量数据,减少回表开销。
SQL 示例:
SELECT * FROM 表名 JOIN (SELECT id FROM 表名 ORDER BY create_time LIMIT 9000000, 10) tmp ON 表名.id = tmp.id
方案三:新增自增序列字段(最彻底)
如果业务允许修改表结构,直接加一个自增的 INT/BIGINT 字段(如 sequence_id )或雪花算法 ID,用这个新字段来做游标分页。
总结建议:
如果不想改表结构,用方案一;
如果允许加字段,用方案三;
如果是后台管理系统必须支持“跳转到第100页”,用方案二。
