MySQL解释与慢日志
使用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;
EXPLAIN
返回的rows
值是为了查找符合查询的结果而必须检查的行数的估计值。
如果你看,你会发现为查询执行选择的关键字是date
,这可能是因为你的ORDER BY
子句而被选中的。 因为在查询中使用的键与WHERE
子句无关,所以这可能就是为什么估计会变得混乱。 即使您的WHERE
子句在name
列上执行LIKE
,优化程序也可能决定不使用索引:
有时MySQL不使用索引,即使有索引。 出现这种情况的一种情况是,优化程序估计使用索引需要MySQL访问表中非常大部分的行。 (在这种情况下,表扫描可能会快得多,因为它需要更少的搜索。)源
简而言之,优化器选择不使用name
键,尽管它将成为返回行的限制因素之一。 您可以尝试强制索引来查看是否可以提高性能。