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 · 8139 次点击
    这是一个创建于 2196 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 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 循环分批
    littleylv
        9
    littleylv  
       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 以内是没问题的
    JaguarJack
        15
    JaguarJack  
       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   ·   实用小工具   ·   3053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:10 · PVG 08:10 · LAX 16:10 · JFK 19:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.