2014-12-02 81 views
1

我有一個3天的數據表(約4000行)。這3組數據全部來自30分鐘的會議。我想要有每個會話的開始和結束時間。MYSQL在一天之內的第一個和最後一個日期時間

我目前使用這個SQL,但它很慢(即使只有4000條記錄)。日期時間表已編入索引,但我認爲由於從日期時間到日期的轉換,索引無法正確使用。 tablelayout是固定的,所以我不能改變任何部分。查詢需要大約20秒鐘的時間來運行..(以及每天越來越長)。任何人都有一些很好的提示,使其更快?

select distinct 
date(a.datetime) datetime, 
(select max(b.datetime) from bike b where date(b.datetime) = date(a.datetime)), 
(select min(c.datetime) from bike c where date(c.datetime) = date(a.datetime)) 
from bike a 

enter image description here

+0

亞歷克斯,也被索引的字段? – Vertig0 2014-12-02 18:49:32

+0

是的,日期時間列被索引。 – 2014-12-02 18:51:30

+0

好吧,並使用JOIN而不是subquerys? – Vertig0 2014-12-02 18:52:17

回答

4

也許我失去了一些東西,但是......

不是由OP查詢相當於回到了該查詢的結果的結果:

SELECT DATE(a.datetime) AS datetime 
     , MAX(a.datetime) AS max_datetime 
     , MIN(a.datetime) AS min_datetime 
    FROM bike a 
    GROUP BY DATE(a.datetime) 
+0

謝謝..昨天晚上,當我用子查詢編寫腳本時,我的腦子一定在圈內跑步! :) – 2014-12-03 05:07:53

0

亞歷克斯,警告,這在鍵入「徒手畫」,因此可能有一些語法問題。但那種表現了我想傳達的東西。

select distinct 
date(a.datetime) datetime, 
(select max(b.datetime) from bike b where b.datetime between date(a.datetime) and (date(a.datetime) + interval 1 day - interval 1 second)), 
(select min(c.datetime) from bike c where c.datetime between date(a.datetime) and (date(a.datetime) + interval 1 day - interval 1 second)) 
from bike a 

相反比較日期(b.datetime),它允許對比較計算出的範圍中的實際b.datetime的形成a.datetime。希望這可以幫助你,並且不會讓事情變得更加混亂。

+0

對相關子查詢中的謂詞進行的更改應該能夠有效使用索引(對'datetime'的前導列進行範圍掃描操作),但是我沒有看到任何相關子查詢的原因是完全需要。這些子查詢將在'bike'中的每一行被執行,然後有一個獨特的操作來刪除「重複」行。有更有效的方法來返回指定的結果。 – spencer7593 2014-12-03 02:16:59

相關問題