MySQL没有在SELECT子句子查询中使用索引

时间:2016-06-01 06:47:01

标签: mysql optimization indexing subquery

我有一个"事件"表

table events
  id (pk, auto inc, unsigned int)
  field1,
  field2,
  ...
  date DATETIME (indexed)

我正在尝试分析交通中的漏洞(一天中有0个事件的时刻)

我尝试了这种请求

SELECT
    e1.date AS date1,
    (
        SELECT date
        FROM events AS e2
        WHERE e2.date > e1.date
        LIMIT 1
    ) AS date2
FROM events AS e1
WHERE e1.date > NOW() -INTERVAL 10 DAY

需要花费大量时间

这是解释

+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+
| id | select_type        | table | type  | possible_keys       | key                 | key_len | ref  | rows     | Extra       |
+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+
|  1 | PRIMARY            | t1    | range | DATE                | DATE                | 6       | NULL |        1 | Using where |
|  2 | DEPENDENT SUBQUERY | t2    | ALL   | DATE                | NULL                | NULL    | NULL | 58678524 | Using where |
+----+--------------------+-------+-------+---------------------+---------------------+---------+------+----------+-------------+
2 rows in set (0.00 sec)

在MySQL 5.5上测试

为什么mysql不能使用DATE索引?是因为子查询?

2 个答案:

答案 0 :(得分:1)

您的查询遇到问题here,它还提供了临时表的快速解决方案。这是一个mysql论坛页面,我通过查找this Stackoverflow问题挖掘了所有这些页面。

您可能会发现动态创建和填充这样一个新表会产生可承受的性能,并且易于实现日期时间范围now()减去10天。

如果您在制作任何东西时需要帮助,请告诉我。我会看看能不能帮忙。

答案 1 :(得分:0)

您正在寻找没有活动的日期?

首先构建一个包含所有可能日期(Days)的表dy。这将为您提供平静的日子:

SELECT dy
    FROM Days
    WHERE NOT EXISTS ( SELECT * FROM events
                        WHERE date >= days.day
                          AND date  < days.day + INTERVAL 1 DAY )
      AND dy > NOW() -INTERVAL 10 DAY

请注意,5.6在这个一般领域有一些优化。