V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jamfer
V2EX  ›  问与答

一个 MYSQL 语句加索引的问题

  •  
  •   jamfer · Oct 10, 2017 · 2500 views
    This topic created in 3121 days ago, the information mentioned may be changed or developed.
    EXPLAIN SELECT * FROM A WHERE a=0 AND b='hk' ORDER BY c DESC

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

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

    你这应该加联合索引才行啊
    jamfer
        5
    jamfer  
    OP
       Oct 10, 2017
    @tabris17 联合索引结果也是一样...
    tabris17
        6
    tabris17  
       Oct 10, 2017
    『返回…… 10 万行……导致查询缓慢』

    我还能说啥呢
    armoni
        7
    armoni  
       Oct 10, 2017
    10 万行 光数据量就多大了, 你这种情况如果是页面查询就做分页,如果是拿出来计算就另外想办法吧
    jamfer
        8
    jamfer  
    OP
       Oct 10, 2017
    @tabris17
    @armoni Sorry 我没说清楚,是有 limit x,30 的。
    mitoop
        9
    mitoop  
       Oct 10, 2017
    a 或者 b 这个列的区分度不够吧
    vindurriel
        10
    vindurriel  
       Oct 10, 2017
    mysql 每次只能用一个索引,因此需要 联合索引 (a,b,c) 。如果(a,b) 区分度够大的话只索引(a,b)也可以,不过 order by c 的过程就得排序了
    select * 真的有必要吗?用索引查出 id 列表之后再去主键索引找完整的数据行(假定引擎是 innodb ),会增加很多随机读。
    ToTChowChow
        11
    ToTChowChow  
       Oct 10, 2017
    如果有主键 ID 的话,可以先 select id from ...,
    然后再根据 id 获取数据
    mooncakejs
        12
    mooncakejs  
       Oct 10, 2017 via iPhone
    limit 10w,30 不管什么索引都慢的。
    jamfer
        13
    jamfer  
    OP
       Oct 10, 2017
    @mooncakejs 可是现在 1,30 都卡的要死...
    gzxultra
        14
    gzxultra  
       Oct 10, 2017
    你倒是把建好的索引和 explain 的结果贴上来啊...
    Lonely
        15
    Lonely  
       Oct 10, 2017 via iPhone
    show index 的结果贴一下
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1019 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 19:05 · PVG 03:05 · LAX 12:05 · JFK 15:05
    ♥ Do have faith in what you're doing.