MySQL查询优化和索引

时间:2013-04-12 17:26:11

标签: mysql sql

我有一个带有索引“create_at”字段的表。我需要做一些聚合查询,但我不明白使用索引来减少范围是无效的。

所有表格:

SELECT COUNT(1) FROM subscriptions

=> 412288行

仅2011年:

SELECT COUNT(1) FROM subscriptions
WHERE (created_at BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59') 

=> 95217行

按月计算2011年总数:

SELECT SQL_NO_CACHE MONTH(created_at) AS agg_created_at, SUM(amount) AS agg_amount 
FROM subscriptions
WHERE (created_at BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59') 
GROUP BY agg_created_at
ORDER BY agg_created_at

=> 0.1398秒

+----+-------------+---------------+------+---------------+------+---------+------+--------+----------------------------------------------+                                                                                                         
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows   | Extra                                        |                                                                                                         
+----+-------------+---------------+------+---------------+------+---------+------+--------+----------------------------------------------+                                                                                                         
|  1 | SIMPLE      | subscriptions | ALL  | created_at    | NULL | NULL    | NULL | 422807 | Using where; Using temporary; Using filesort |                                                                                                         
+----+-------------+---------------+------+---------------+------+---------+------+--------+----------------------------------------------+ 

与强制索引相同的查询:

SELECT SQL_NO_CACHE MONTH(created_at) AS agg_created_at, SUM(amount) AS agg_amount 
FROM subscriptions FORCE INDEX(created_at)
WHERE (created_at BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59') 
GROUP BY agg_created_at
ORDER BY agg_created_at

=> 0.1283秒

 +----+-------------+---------------+-------+---------------+------------+---------+------+--------+----------------------------------------------+
| id | select_type | table         | type  | possible_keys | key        | key_len | ref  | rows   | Extra                                        |
+----+-------------+---------------+-------+---------------+------------+---------+------+--------+----------------------------------------------+
|  1 | SIMPLE      | subscriptions | range | created_at    | created_at | 8       | NULL | 194106 | Using where; Using temporary; Using filesort |
+----+-------------+---------------+-------+---------------+------------+---------+------+--------+----------------------------------------------+

优化器在这里看起来很聪明,因为使用索引来缩小范围是无效的,但我不明白为什么。如果有人有解释?

0 个答案:

没有答案