jsrgqinbin
V2EX  ›  问与答

Mysql 的一个困惑,求解答

  •  
  •   jsrgqinbin · Dec 19, 2015 · 2673 views
    This topic created in 3806 days ago, the information mentioned may be changed or developed.

    150W 条记录的一个订单表。

    mysql> select * from orders where error_status = 0 AND line_id = 0 limit 1;
    1 row in set (0.01 sec)
    mysql> select * from orders where error_status = 0 AND line_id = 0 and version=3 limit 1; 1 row in set (10.01 sec)

    以上两个查询效率相差太大了, error_status , line_id 都建了索引,就加了一个 version 的条件。

    version 为 tinyint 型的基数比较小,只有 0 , 1 , 2 , 3 这 4 个值。

    尝试 version 添加索引,对查询效率没有提高。

    有人指点下,为啥加了 version 就特别慢

    11 replies    2015-12-21 16:03:47 +08:00
    kn007
        1
    kn007  
       Dec 19, 2015
    试试联合索引?
    忘记哪个脚本有索引建立推荐。。。
    msg7086
        2
    msg7086  
       Dec 19, 2015
    后者要用 (error_status, line_id, version) 联合索引。
    billlee
        3
    billlee  
       Dec 19, 2015
    先 EXPLAIN 看一下
    shiny
        4
    shiny  
    PRO
       Dec 19, 2015
    前一条有没有 Query Cache?先 explain 吧……
    holyghost
        5
    holyghost  
       Dec 19, 2015
    我不太懂,但是感觉 5.6 可以用 index condition pushdown 解决一部分这样的问题。

    求轻打脸。
    lenran
        6
    lenran  
       Dec 19, 2015
    version 字段唯一性不高,不应该创建索引吧
    test1199
        7
    test1199  
       Dec 19, 2015
    语句顺序: version 放前边, 那俩有索引得放后边
    guoer
        8
    guoer  
       Dec 20, 2015 via iPhone
    @test1199 mysql 会自动调整顺序吧
    jsrgqinbin
        9
    jsrgqinbin  
    OP
       Dec 21, 2015
    @test1199 试过,效果一样
    jsrgqinbin
        10
    jsrgqinbin  
    OP
       Dec 21, 2015
    @billlee 使用的索引以及影响的行数是一样的
    toben
        11
    toben  
       Dec 21, 2015
    感觉只有这 3 个字段的联合索引会变快=.=!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1138 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 18:04 · PVG 02:04 · LAX 11:04 · JFK 14:04
    ♥ Do have faith in what you're doing.