代码之家  ›  专栏  ›  技术社区  ›  vikmalhotra

查询优化中的首选项:使用文件排序或检查更多行

  •  2
  • vikmalhotra  · 技术社区  · 15 年前

    我正在尝试使用explain优化这个MySQL查询。有人能帮我一下吗?

    EXPLAIN SELECT * FROM keyword
    WHERE keyword LIKE "panasonic%"
    AND keyword != "panasonic"
    AND price < 3230 AND price > 3370
    ORDER BY price DESC
    LIMIT 99
    

    基本上我想找出以“some keyword”开头但不完全匹配的关键字,以及谁的价格是 在某些特定范围内。哦,我必须按价格的降序排列(这就是问题所在)。

    解释输出:

    id: 1
    select_type: SIMPLE
    table: keyword
    type: range
    possible_keys: PRIMARY, keyword_price, price_keyword
    key: keyword_price
    key_len: 765
    ref: NULL
    rows: 24
    Extra: Using where; Using filesort
    

    索引 关键字名称:列名称

    PRIMARY: keyword
    keyword_price: keyword, price
    price_keyword: price, keyword
    

    现在,如果我给出使用索引的提示,并将查询更改为

    EXPLAIN SELECT * FROM keyword USE INDEX (price_keyword)
    WHERE keyword LIKE "panasonic%"
    AND keyword != "panasonic"
    AND price < 3230 AND price > 3370
    ORDER BY price DESC
    LIMIT 99
    

    解释输出更改

    id: 1
    select_type: SIMPLE
    table: keyword
    type: index
    possible_keys: price_keyword
    key: price_keyword
    key_len: 790
    ref: NULL
    rows: 1043044 (WHAT THE ????)
    Extra: Using where
    

    解释输出显示行数呈指数级增长,但“使用文件排序”已不复存在。

    在这种情况下,哪个查询更好?“检查的行”列是否具有欺骗性?

    当做

    1 回复  |  直到 7 年前
        1
  •  3
  •   Riedsio    13 年前

    在这种情况下,哪个查询更好?

    在这个里面 具体的 我希望第一个查询是 更好的 .

    选项a) 拉动以所示关键字开头的~24行,并按价格对其进行排序(请注意,文件排序是一种算法,并不表示排序是在磁盘上完成的)。

    选项b) 按价格顺序拉大约100万行,检查所有行是否符合关键字约束(直到您得到99行)。

    如果你的关键词是 's' 或者你的数据不统一,更好的选择 能够 倒车。无论如何,我认为对于大多数应用程序,选项a)都是赢家。

    “检查的行”列是否具有欺骗性?

    一定地。中检查的行 EXPLAIN 是一个估计。最好检查类似的输出

    SHOW SESSION STATUS LIKE 'handler_%'

    看看你有几排 事实上 拉动。