使用MySQL(5.1.66)说明它将扫描仅72行,而“慢速日志”报告整个表被扫描(Rows_examined:5476845) 这怎么可能?我无法弄清楚查询有什么问题
*name*
是一个字符串唯一索引和
*date*
只是一个常规的int索引
这是EXPLAIN
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 table index name date 4 NULL 72 Using 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;
答案 0 :(得分:4)
从rows
返回的EXPLAIN
值是估算值,必须检查这些行以查找与您的查询匹配的结果。
如果你看一下,你会看到为查询执行选择的密钥是date
,由于你的ORDER BY
子句,可能会选择该密钥。因为查询中使用的密钥与您的WHERE
子句无关,所以这可能是为什么估计会搞砸了。即使您的WHERE
子句在LIKE
列上执行name
,优化程序也可能决定不使用索引:
有时MySQL不使用索引,即使有索引也是如此。一 发生这种情况的情况是优化程序估计的时间 使用索引需要MySQL访问非常大的 表中行的百分比。 (在这种情况下,表扫描是 可能要快得多,因为它需要较少的搜索。)source
简而言之,优化器选择不使用name
密钥,即使它是要返回的行的限制因素。您可以尝试forcing the index查看是否可以提高效果。