V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
la2la
V2EX  ›  程序员

迫于水平不够, MySQL 查询语句出现问题,例如:使用 LIMIT 速度变慢,使用 IN 少数据

  •  
  •   la2la · 2019-06-20 11:10:26 +08:00 · 1265 次点击
    这是一个创建于 1765 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这几天协助开发接口,使用 MySQL 查询出现问题

    第一个问题使用 ORDER BY + LIMIT 查询变慢

    这个问题猜测是索引问题,查阅资料使用 force index 解决

    # DEV_INFO 表数据量 5 千万级别,DEV_ID 唯一索引,C_TIME 普通索引
    sql> SELECT DEV_INFO FROM DEVICE_INFO WHERE DEV_ID = "500000022" ORDER BY C_TIME DESC limit 1;
    结果:太慢了 直接 timeout 了
    
    sql> SELECT DEV_INFO FROM DEVICE_INFO FORCE INDEX(DEV_ID) WHERE DEV_ID = "500000022" ORDER BY C_TIME DESC limit 1;
    结果:1 row retrieved starting from 1 in 106 ms (execution: 94 ms, fetching: 12 ms)
    

    第二个问题很奇怪,目前没有想通

    明明应该能查出 13 条数据,结果只有 12 条记录,我确定少的那个 ID 82985 数据库中存在

    # (里面有 13 个 ID)
    sql> select * from POINT where ID in (82925,82909,82905,82901,82929,82981,82979,82977,82975,82983,92985,83013,83005);
    结果:12 rows retrieved starting from 1 in 87 ms (execution: 55 ms, fetching: 32 ms)
    
    sql> select * from POINT WHERE ID=82985;
    结果:1 row retrieved starting from 1 in 83 ms (execution: 58 ms, fetching: 25 ms)
    

    我想到这些问题应该都是 MySQL 执行的问题

    所以 我想系统的学习一下 sql 深一点的知识,有没有推荐的 教程或者书籍

    第 1 条附言  ·  2019-06-20 12:20:55 +08:00

    啊 第二个问题,确实需要我配个眼镜

    第一个,DEV_ID 不是唯一索引,我写错了,就是普通索引,所以会查出多条数据

    sagaxu
        1
    sagaxu  
       2019-06-20 11:16:03 +08:00 via Android   ❤️ 1
    你需要治疗近视眼
    telami
        2
    telami  
       2019-06-20 11:23:14 +08:00
    第一个问题,搞不太懂都用 id 查了,为啥还要 order by limit 1,难道会查出来多条么

    第二个问题,附议楼上。
    lecoo
        3
    lecoo  
       2019-06-20 11:26:43 +08:00
    你 13 个 ID 里就没有 82985。
    zhuangjia
        4
    zhuangjia  
       2019-06-20 11:34:58 +08:00
    82985 确实不在 13 个 ID 里面。附议上三楼
    RubyJack
        5
    RubyJack  
       2019-06-20 11:38:25 +08:00
    1L 笑尿了哈哈哈哈哈哈
    dilu
        6
    dilu  
       2019-06-20 11:51:18 +08:00 via Android
    不要强制使用索引,除非你已经 diao 到爆炸
    akira
        7
    akira  
       2019-06-20 12:11:19 +08:00
    遇到性能问题,先上 explain,大部分性能问题都能通过这个确认
    sagaxu
        8
    sagaxu  
       2019-06-20 13:23:27 +08:00 via Android
    把 DEV_ID 索引去掉,建一个(DEV_ID, C_TIME DESC)联合索引
    la2la
        9
    la2la  
    OP
       2019-06-20 13:29:57 +08:00
    @akira explain 了下,加了 limit ref 变成了 index,但是不清楚为啥会变
    la2la
        10
    la2la  
    OP
       2019-06-20 13:30:29 +08:00
    @sagaxu 这个没有权限
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2793 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:42 · PVG 19:42 · LAX 04:42 · JFK 07:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.