mysql 中 in 大量 id 该怎样优化 - V2EX
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
cc959798
V2EX    MySQL

mysql 中 in 大量 id 该怎样优化

  •  
  •   cc959798 2018-11-20 16:59:40 +08:00 8495 次点击
    这是一个创建于 2593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 where id in (...),如果里面几条或者十几条还是很快的,但是我们需要一次查出上万条不同 id 的数据,该怎办,这时候 explain 显示的全表扫了

    26 条回复    2018-11-21 18:54:20 +08:00
    mayday526
        1
    mayday526  
       2018-11-20 17:55:00 +08:00
    用 in 查询的那个字段加上索引试试
    utf16
        2
    utf16  
       2018-11-20 17:57:31 +08:00
    exists 了解一下
    lucn
        3
    lucn  
       2018-11-20 17:59:23 +08:00
    拆分成多个查询呗,每次少查点,id 是主键的话,上万个主键查找,查询引擎优化成表扫描不是很正常么
    sfqtsh
        4
    sfqtsh  
       2018-11-20 18:00:05 +08:00 via Android
    in 几万几十万 走索引也不是很快了,,pg
    limuyan44
        5
    limuyan44  
       2018-11-20 18:12:44 +08:00 via Android
    优化完就直接扫表了,能同时查肯定有业务特征的啊,加个字段吧。
    dezhou9
        6
    dezhou9  
       2018-11-20 18:22:49 +08:00 via Android
    字典树匹配
    mmdsun
        7
    mmdsun  
       2018-11-20 18:52:52 +08:00 via Android
    in MySQL 默认有一定的优化。我看是 in 太多了 MySQL 判断不走索引了。可以强制索引:select * from table force index(索引)
    Raymon111111
        8
    Raymon111111  
       2018-11-20 19:48:27 +08:00
    for 循环分批
    U7Q5tLAex2FI0o0g
        9
    U7Q5tLAex2FI0o0g  
       2018-11-20 20:05:26 +08:00
    分页?
    Immortal
        10
    Immortal  
       2018-11-20 20:08:20 +08:00
    2l 给思路了 有个 in 和 exists 转化的 具体 google 下
    cc959798
        11
    cc959798  
    OP
       2018-11-20 20:11:16 +08:00
    @mayday526 id 是主键呀
    cc959798
        12
    cc959798  
    OP
       2018-11-20 20:11:47 +08:00
    @mmdsun 这样好像也不走索引
    zhangZMZ
        13
    zhangZMZ  
       2018-11-20 20:24:32 +08:00
    force index
    zhangZMZ
        14
    zhangZMZ  
       2018-11-20 20:24:49 +08:00
    mysql 在 10W 以内是没问题的
    akagishigeru
        15
    akagishigeru  
       2018-11-20 21:07:36 +08:00 via iPhone
    分批次走索引吧
    HuHui
        16
    HuHui  
       2018-11-20 21:10:33 +08:00 via Android
    先从业务入手吧
    jimrok
        17
    jimrok  
       2018-11-20 21:14:02 +08:00
    用 nosql,memcached 和 redis 都有类似的方法,可以一次返回多个 key 的数据。上万个,你这个业务也有点问题吧?难道每次不做分页?
    yidinghe
        18
    yidinghe  
       2018-11-20 21:15:41 +08:00 via Android
    因为要扫描的记录数量确实有这么多,这时候索引已经没有办法继续帮助优化扫描过程了。那么一种策略就是尽快返回。查询 id 的语句执行完后,一边从 cursor 取 id,一边分批次对这些 id 做后面的操作。
    lxerxa
        19
    lxerxa  
       2018-11-20 21:36:45 +08:00 via iPhone
    考虑用 exists
    cc959798
        20
    cc959798  
    OP
       2018-11-20 21:41:05 +08:00
    @lxerxa 这种方式好像用不到子查询,没法改成 exists
    lxerxa
        21
    lxerxa  
       2018-11-20 21:42:22 +08:00 via iPhone
    @cc959798 原则上用 in 的又可以改成 exists
    cc959798
        22
    cc959798  
    OP
       2018-11-21 11:20:12 +08:00
    @lxerxa 大佬,这种怎么改 select * from tb_name where id in (123,321,231) 就一张表
    cc959798
        23
    cc959798  
    OP
       2018-11-21 11:20:55 +08:00
    @zhangZMZ 试过了也不管用,就是走索引,其实 id 间差距不大,走索引的话应该没什么问题
    lxerxa
        24
    lxerxa  
       2018-11-21 11:54:59 +08:00
    @lxerxa in 里的 id 来自哪里?同一个表吗? 不会告诉我是几个常量吧
    zhangZMZ
        25
    zhangZMZ  
       2018-11-21 18:35:15 +08:00
    目前看来这个问题的解决需要依赖于楼主是否是妹子,而且是否漂亮、有没有男朋友了。
    cc959798
        26
    cc959798  
    OP
       2018-11-21 18:54:20 +08:00
    @lxerxa 这个是这样的前端传过来的 id 值,可能有很多,而且这个 id 就是这个表里的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5220 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 09:12 PVG 17:12 LAX 01:12 JFK 04:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86