V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jamfer
V2EX  ›  问与答

一个 MYSQL 语句加索引的问题

  •  
  •   jamfer · 2017-10-10 09:47:11 +08:00 · 2082 次点击
    这是一个创建于 2627 天前的主题,其中的信息可能已经有所发展或是发生改变。
    EXPLAIN SELECT * FROM A WHERE a=0 AND b='hk' ORDER BY c DESC

    如上,很简单的 SQL 语句,表 A 大约有 30 万条数据。

    我给 a 字段和 b 字段都加了 index 索引。但结果返回的行数还是太多( 10 万行)导致查询缓慢。有没有更好的优化办法
    15 条回复    2017-10-10 21:43:18 +08:00
    qiayue
        1
    qiayue  
       2017-10-10 09:48:08 +08:00
    c 也要
    jamfer
        2
    jamfer  
    OP
       2017-10-10 09:51:20 +08:00
    @qiayue 试了给 c 也加上,还是一样 10 万行
    Ison
        3
    Ison  
       2017-10-10 09:54:35 +08:00
    查询缓慢的原因是匹配的项目多
    重点在于在查询过程尽早缩小查询匹配项目的范围
    如果你本来的匹配目标就多那再优化也没用
    如果你匹配目标少但现在返回的多
    那就把多缩小范围最有效的过滤条件提前
    tabris17
        4
    tabris17  
       2017-10-10 09:55:43 +08:00
    什么叫“ a 字段和 b 字段都加了 index 索引”

    你这应该加联合索引才行啊
    jamfer
        5
    jamfer  
    OP
       2017-10-10 09:56:59 +08:00
    @tabris17 联合索引结果也是一样...
    tabris17
        6
    tabris17  
       2017-10-10 10:00:12 +08:00
    『返回…… 10 万行……导致查询缓慢』

    我还能说啥呢
    armoni
        7
    armoni  
       2017-10-10 10:05:42 +08:00
    10 万行 光数据量就多大了, 你这种情况如果是页面查询就做分页,如果是拿出来计算就另外想办法吧
    jamfer
        8
    jamfer  
    OP
       2017-10-10 10:14:26 +08:00
    @tabris17
    @armoni Sorry 我没说清楚,是有 limit x,30 的。
    mitoop
        9
    mitoop  
       2017-10-10 12:47:58 +08:00
    a 或者 b 这个列的区分度不够吧
    vindurriel
        10
    vindurriel  
       2017-10-10 14:30:59 +08:00
    mysql 每次只能用一个索引,因此需要 联合索引 (a,b,c) 。如果(a,b) 区分度够大的话只索引(a,b)也可以,不过 order by c 的过程就得排序了
    select * 真的有必要吗?用索引查出 id 列表之后再去主键索引找完整的数据行(假定引擎是 innodb ),会增加很多随机读。
    ToTChowChow
        11
    ToTChowChow  
       2017-10-10 16:24:06 +08:00
    如果有主键 ID 的话,可以先 select id from ...,
    然后再根据 id 获取数据
    mooncakejs
        12
    mooncakejs  
       2017-10-10 19:37:05 +08:00 via iPhone
    limit 10w,30 不管什么索引都慢的。
    jamfer
        13
    jamfer  
    OP
       2017-10-10 19:39:47 +08:00
    @mooncakejs 可是现在 1,30 都卡的要死...
    gzxultra
        14
    gzxultra  
       2017-10-10 21:21:18 +08:00
    你倒是把建好的索引和 explain 的结果贴上来啊...
    Lonely
        15
    Lonely  
       2017-10-10 21:43:18 +08:00 via iPhone
    show index 的结果贴一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3124 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.