【问题标题】:MySQL Explain vs Slow LogMySQL 解释 vs 慢日志
【发布时间】:2013-01-19 14:38:06
【问题描述】:

使用 MySQL (5.1.66) 解释说它只会扫描 72 行,而“慢日志”报告整个表已被扫描 (Rows_examined: 5476845) 这怎么可能?我无法弄清楚查询有什么问题

*name* 是一个字符串唯一索引,并且 *date* 只是一个普通的 int 索引

这是解释 EXPLAIN SELECT * FROM table WHERE name LIKE 'The%Query%' ORDER BY date DESC LIMIT 3;

id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE 表索引名称日期 4 NULL 72 使用 where

慢日志输出

# Query_time: 5.545731 Lock_time: 0.000083 Rows_sent: 1 Rows_examined: 5476845 SET timestamp=1360007079; SELECT * FROM table WHERE name LIKE 'The%Query%' ORDER BY date DESC LIMIT 3;

【问题讨论】:

    标签: mysql performance explain


    【解决方案1】:

    EXPLAIN 返回的rows 值是估计为了找到与您的查询匹配的结果而必须检查的行数。

    如果您查看,您会看到为查询执行选择的键是date,这可能是因为您的ORDER BY 子句而被选择的。因为查询中使用的键与您的 WHERE 子句无关,这可能就是估计被搞砸的原因。即使您的WHERE 子句在name 列上执行LIKE,优化器也可能决定根本不使用索引:

    有时 MySQL 不使用索引,即使索引可用。一 发生这种情况的情况是优化器估计 使用索引需要 MySQL 访问一个非常大的 表中行的百分比。 (在这种情况下,表扫描是 可能会更快,因为它需要更少的搜索。)source

    简而言之,优化器选择不使用name 键,即使它是要返回的行的限制因素。你可以试试forcing the index 看看是否能提高性能。

    【讨论】:

    • 感谢您的回复。在name 上使用 FORCE INDEX 可使大多数查询更快。但我仍然需要date 索引来确保索引是否太大而无法选择最新的(例如,% 很大,最后一个会使其更快)。对两者都执行 FORCE INDEX 会使查询与没有 FORCE INDEX 一样慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多