我的查询运行速度比应该慢得多。我已将问题简化为简单的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_a
在date
字段上有一个索引。
显然是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。