MySQL解释与慢速日志

时间:2013-02-04 19:55:39

标签: mysql performance explain

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

1 个答案:

答案 0 :(得分:4)

rows返回的EXPLAIN值是估算值,必须检查这些行以查找与您的查询匹配的结果。

如果你看一下,你会看到为查询执行选择的密钥是date,由于你的ORDER BY子句,可能会选择该密钥。因为查询中使用的密钥与您的WHERE子句无关,所以这可能是为什么估计会搞砸了。即使您的WHERE子句在LIKE列上执行name,优化程序也可能决定不使用索引:

  

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

简而言之,优化器选择不使用name密钥,即使它是要返回的行的限制因素。您可以尝试forcing the index查看是否可以提高效果。