【问题标题】:Indexes are not getting used in MySQL queryMySQL 查询中未使用索引
【发布时间】: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


【解决方案1】:

您可以显式强制引擎使用索引。

查看http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

【讨论】:

  • 这并没有回答这个问题,虽然它是真的。
猜你喜欢
  • 2016-07-29
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2018-06-02
  • 2013-09-16
相关资源
最近更新 更多