V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
ben548
V2EX  ›  MySQL

not in 场景下,下面四个方案哪个是最优解呢?

  •  
  •   ben548 · 2023-09-18 15:01:31 +08:00 · 986 次点击
    这是一个创建于 432 天前的主题,其中的信息可能已经有所发展或是发生改变。
    活动有设置精选的需求,设置的数量不限(就是说可能很多个,但是从当下的场景来看一般不超过 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 差不多?

    大家觉得呢?
    2 条回复    2023-09-18 16:20:13 +08:00
    msaionyc
        1
    msaionyc  
       2023-09-18 15:39:39 +08:00
    add column activity_type tinyint default 1 comment "1.普通 2.精选"
    select * from activity where activity_type = 1
    ben548
        2
    ben548  
    OP
       2023-09-18 16:20:13 +08:00
    @msaionyc 牛逼,这样做确实不用联表也不用子查询也避免了 not in ,用这个方案了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:55 · PVG 15:55 · LAX 23:55 · JFK 02:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.