我有一个"事件"表
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索引?是因为子查询?
答案 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在这个一般领域有一些优化。