【发布时间】:2014-12-01 18:40:26
【问题描述】:
我已经编写了下面的查询,运行它需要将近 5 分钟。我在表中有 600 万行数据,从执行计划中发现,即使表的所有字段都有索引,我的查询也不使用索引。
查询
SELECT
event_date as date,
(CAST('2014-05-31' AS DATE)- INTERVAL 5 MONTH + INTERVAL 1 DAY) AS FROM_DATE,
COUNT(DISTINCT(IF( Column1 !=0 OR Column2!=0 OR Column3 !=0, account, NULL))) AS total_account1,
COUNT(DISTINCT(IF( Column4 !=0 OR Column5 !=0 OR Column6!=0, account, NULL))) AS total_account2,
COUNT(DISTINCT(IF( Column7 !=0 OR Column8 !=0 OR Column9!=0, account, NULL))) AS total_account3
FROM Table_name
WHERE cast(event_date as DATE) BETWEEN CAST('2014-05-31' AS DATE)- INTERVAL 5 MONTH and CAST('2014-05-31' AS DATE)
AND cast(event_date as DATE) < NOW() - INTERVAL 2 DAY
GROUP BY MONTH(event_date)
上面查询输出的“解释”是-
+----+-------------+---------+------+---------------+------+---------+------+---------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+---------+-----------------------------+
| 1 | SIMPLE | table_name | ALL | NULL | NULL | NULL | NULL | 5764552 | Using where; Using filesort |
+----+-------------+---------+------+---------------+------+---------+------+---------+-----------------------------+
为什么我的查询没有使用可用的索引?
【问题讨论】:
-
您能否确认您在 where 子句中使用与索引列顺序相同的顺序?如果不是,请根据where子句中的索引列顺序进行更改,那么它应该会改进。
-
把
CAST扔出窗外。 -
在 where 子句中我使用了 event_Date,它是表中的主键。
-
stackoverflow.com/questions/799584/… 我相信这是因为您编写 where 子句的方式使此查询不可搜索。
标签: mysql performance indexing