2

使用 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;

4

1 回答 1

4

rows从 an 返回的值是对必须检查以查找与查询匹配的结果的行数EXPLAIN估计。

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

有时 MySQL 不使用索引,即使索引可用。发生这种情况的一种情况是优化器估计使用索引将需要 MySQL 访问表中很大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要的搜索次数更少。)来源

简而言之,优化器选择不使用name键,即使它是要返回的行的限制因素。您可以尝试强制索引以查看是否可以提高性能。

于 2013-02-04T20:16:23.290 回答