添加SQL_CALC_FOUND_ROWS时,MySQL停止使用索引

时间:2016-01-12 01:22:05

标签: mysql sql-calc-found-rows

我的查询运行速度比应该慢得多。我已将问题简化为简单的select语句(某些字段已重命名为隐私):

SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS id, date_started, date_complete, status
FROM table_a
ORDER BY date DESC
LIMIT 0, 100

当使用SQL_CALC_FOUND_ROWS时,查询在大约0.70秒内完成,但是当删除SQL_CALC_FOUND_ROWS时,查询在大约0.0005秒内完成(在这两种情况下SQL_NO_CACHE都在查询中使用)。

table_adate字段上有一个索引。

显然是SQL_CALC_FOUND_ROWS can prevent an index from being used:

  

因此,从这个简单的测试中得出的明显结论是:当我们拥有时   在我们的查询中适当的WHERE / ORDER子句索引,它是很多   更快地使用两个单独的查询而不是一个   SQL_CALC_FOUND_ROWS。

我已经证实了这一点。如果包含SQL_CALC_FOUND_ROWS,则不使用索引:

EXPLAIN SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS id, date_started, date_complete, status FROM table_a ORDER BY date DESC limit 0, 100;
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows   | Extra          |
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
|  1 | SIMPLE      | table_a     | ALL  | NULL          | NULL | NULL    | NULL | 132208 | Using filesort | 
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+

但是当不使用SQL_CALC_FOUND_ROWS时,则使用日期字段上的索引:

EXPLAIN SELECT SQL_NO_CACHE id, date_started, date_complete, status FROM table_a ORDER BY date DESC limit 0, 100;
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+
| id | select_type | table       | type  | possible_keys | key  | key_len | ref  | rows   | Extra |
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+
|  1 | SIMPLE      | table_a     | index | NULL          | date | 13      | NULL | 132208 |       | 
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+

如果不从查询中删除SQL_CALC_FOUND_ROWS,有没有办法加快查询速度?

我使用的是MySQL 5.0.51a-3ubuntu5.1-log。

0 个答案:

没有答案