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键,尽管它将成为返回行的限制因素之一。 您可以尝试强制索引来查看是否可以提高性能。

链接地址: http://www.djcxy.com/p/25083.html

上一篇: MySQL Explain vs Slow Log

下一篇: Indexes in Mysql Query behaving indifferently