关于分页查询优化的问题

来源:5-6 高并发引起的重复写入

小小同学William

2018-12-18

关于分页有两个疑问:

  1. select * from bigdata where id > 5000000 and id <= 5000000+10; 此种方案适合主键连续,因此表的设计采用逻辑删除。
    疑问:例如 5000003、5000004 被标识成逻辑删除,如果在用上面的语句查询,那查出来的数据里就会包含 “已删除” 的数据了。可是如果在 where 条件里过滤掉逻辑删除的标识,查询出来的数据又不满足 10 条分页要求(其中有两条已经过滤掉了,设计查出来的只是8条而已)。这钟情况该怎么办呢 ?

  2. 如果我的主键id 设计的并不是有序的 int 类型,而是 uuid 呢 ?上面那种方法肯定就不行了吧,而在继续沿用 LIMIT 关键字,那性能问题还是无法解决。

写回答

1回答

神思者

2018-12-18

第一种情况,我在视频里讲过,还有一种折中方案,先查询只有主键的分页记录,然后再做表连接根据主键抓取完整的记录。第二种情况,用uuid做主键是因为在分布式环境下吧。uuid做主键在Oracle上没什么性能的损失,但是用在MySQL上性能损失很大,所以不是极特殊的情况,一般都不会用uuid做mysql主键。第二种分页也可以采用第一种的方式用表连接来做加速

0
1
小小同学William
第一种情况:我的本意是想问,即使把表设计成了逻辑删除,在通过“where id > 5000000 and id <= 5000000+10;”此种方法也不能满足“完全通过主键id”查询的需求吧,因为要过滤掉被标识成删除的数据。 第二种情况:分布式是一方面,另一种情况可能会是在应用系统更换数据源的时候会产生有序主键的冲突问题,例如我的数据源之前用的是oracle,序列都是用sequence生成的,因为需求导致可能下一套系统的数据源要改成mysql (后台没有使用Hibernate之类的ORM框架就是纯手工的写sql),所以使用uuid在做迁移的时候会省不少事。
2018-12-18
共1条回复

MySQL数据库集群-PXC方案,解决数据库领域疑难杂症

学习PXC,打造高价值的MySQL集群

511 学习 · 217 问题

查看课程