› 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 · Nov 20, 2018 · 8994 views
    This topic created in 2865 days ago, the information mentioned may be changed or developed.

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

    26 replies  •  2018-11-21 18:54:20 +08:00
    mayday526
        1
    mayday526  
       Nov 20, 2018
    用 in 查询的那个字段加上索引试试
    utf16
        2
    utf16  
       Nov 20, 2018
    exists 了解一下
    lucn
        3
    lucn  
       Nov 20, 2018
    拆分成多个查询呗,每次少查点,id 是主键的话,上万个主键查找,查询引擎优化成表扫描不是很正常么
    sfqtsh
        4
    sfqtsh  
       Nov 20, 2018 via Android
    in 几万几十万 走索引也不是很快了,,pg
    limuyan44
        5
    limuyan44  
       Nov 20, 2018 via Android
    优化完就直接扫表了,能同时查肯定有业务特征的啊,加个字段吧。
    dezhou9
        6
    dezhou9  
       Nov 20, 2018 via Android
    字典树匹配
    mmdsun
        7
    mmdsun  
       Nov 20, 2018 via Android
    in MySQL 默认有一定的优化。我看是 in 太多了 MySQL 判断不走索引了。可以强制索引:select * from table force index(索引)
    Raymon111111
        8
    Raymon111111  
       Nov 20, 2018
    for 循环分批
    U7Q5tLAex2FI0o0g
        9
    U7Q5tLAex2FI0o0g  
       Nov 20, 2018
    分页?
    Immortal
        10
    Immortal  
       Nov 20, 2018
    2l 给思路了 有个 in 和 exists 转化的 具体 google 下
    cc959798
        11
    cc959798  
    OP
       Nov 20, 2018
    @mayday526 id 是主键呀
    cc959798
        12
    cc959798  
    OP
       Nov 20, 2018
    @mmdsun 这样好像也不走索引
    zhangZMZ
        13
    zhangZMZ  
       Nov 20, 2018
    force index
    zhangZMZ
        14
    zhangZMZ  
       Nov 20, 2018
    mysql 在 10W 以内是没问题的
    akagishigeru
        15
    akagishigeru  
       Nov 20, 2018 via iPhone
    分批次走索引吧
    HuHui
        16
    HuHui  
       Nov 20, 2018 via Android
    先从业务入手吧
    jimrok
        17
    jimrok  
       Nov 20, 2018
    用 nosql,memcached 和 redis 都有类似的方法,可以一次返回多个 key 的数据。上万个,你这个业务也有点问题吧?难道每次不做分页?
    yidinghe
        18
    yidinghe  
    PRO
       Nov 20, 2018 via Android
    因为要扫描的记录数量确实有这么多,这时候索引已经没有办法继续帮助优化扫描过程了。那么一种策略就是尽快返回。查询 id 的语句执行完后,一边从 cursor 取 id,一边分批次对这些 id 做后面的操作。
    lxerxa
        19
    lxerxa  
       Nov 20, 2018 via iPhone
    考虑用 exists
    cc959798
        20
    cc959798  
    OP
       Nov 20, 2018
    @lxerxa 这种方式好像用不到子查询,没法改成 exists
    lxerxa
        21
    lxerxa  
       Nov 20, 2018 via iPhone
    @cc959798 原则上用 in 的又可以改成 exists
    cc959798
        22
    cc959798  
    OP
       Nov 21, 2018
    @lxerxa 大佬,这种怎么改 select * from tb_name where id in (123,321,231) 就一张表
    cc959798
        23
    cc959798  
    OP
       Nov 21, 2018
    @zhangZMZ 试过了也不管用,就是走索引,其实 id 间差距不大,走索引的话应该没什么问题
    lxerxa
        24
    lxerxa  
       Nov 21, 2018
    @lxerxa in 里的 id 来自哪里?同一个表吗? 不会告诉我是几个常量吧
    zhangZMZ
        25
    zhangZMZ  
       Nov 21, 2018
    目前看来这个问题的解决需要依赖于楼主是否是妹子,而且是否漂亮、有没有男朋友了。
    cc959798
        26
    cc959798  
    OP
       Nov 21, 2018
    @lxerxa 这个是这样的前端传过来的 id 值,可能有很多,而且这个 id 就是这个表里的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2391 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 05:46 · PVG 13:46 · LAX 22:46 · JFK 01:46
    ♥ Do have faith in what you're doing.