首页   注册   登录
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
V2EX  ›  MySQL

mysql 中 in 大量 id 该怎样优化

  •  
  •   cc959798 · 57 天前 · 1967 次点击
    这是一个创建于 57 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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