活动有设置精选的需求,设置的数量不限(就是说可能很多个,但是从当下的场景来看一般不超过 2000 ),现在需要从数据库里面分页查询除设置精选外的活动数据,我想了想有几种查询方式,
1 、用 not in 语句:select * from activity where id not in (精选活动 id ) limit offset, pagesize
2 、不用 not in 语句,select * from activity where id > 上一次查询的 id (第一次是 0 ) limit offset, pagesize ,然后将查询结果跟精选活动 id 集合比对,去除在集合内的数据,如果结果条目数小于 pagesize ,则进入下一次查询,直到满足结果条数=pagesize ,退出查询循环并返回结果
3 、将精选活动 id 数据写入 featured 表,用子查询,即 select * from activity where id not in ( select id from featured ) limit offset, pagesize
4 、也是将将精选活动 id 数据写入 featured 表,用联表查询,select * from activity left join featured on
activity.id !=
featured.id limit offset,pagesize
个人感觉方案 1 在数据量不大的情况下,应该是最优方案,但是如果精选活动 id 数据量过大,则方案 1 的 sql 语句可能还不如方案 2 ,方案 3 和方案 4 的比较中,我感觉我更倾向于选择方案 4 ,但是说不出啥原因感觉是一种直觉[捂脸]
所以其实我的结论是数据量小直接方案 1 ,数据量大的话方案 4 比较合适。
方案 3 的执行逻辑是不是本质上和方案 1 差不多?
大家觉得呢?