2013-04-22 85 views
1

我有如下表:加快我的MySQL聲明

+---------------------+-------+ 
| t     | price | 
+---------------------+-------+ 
| 2013-04-22 13:23:51 | 9.42 | 
+---------------------+-------+ 

其中T是類型時間戳和價格浮動。

桌子很大,大約有500K行。

任務:

我要顯示錶和過去3天內MIN價格爲每行。

所以我寫了以下內容:

select *,(
    select max(b.price) 
    from my_table b 
    where b.t<a.t and date(b.t)>=adddate(date(a.t),-3) 
) from my_table a; 

的問題是,它訥韋爾完成我的查詢,它看起來像它掛....有什麼辦法來speeed了查詢?還是我做錯了什麼?

+1

你在'timestamp'上有'index'嗎?這將有助於顯着 – 2013-04-22 05:36:07

+0

是的,我沒有設置爲索引。 – kido9797 2013-04-22 10:41:11

回答

0

我認爲你的adddate函數可能不正確。嘗試使用這樣的:ADDDATE(AT,間隔3日)

+0

我只是用很少的行再次嘗試,但速度也被剔除: mysql> select count(*)from my_table where date(t)= date(now()); + ---------- + | count(*)| + ---------- + | 634 | + ---------- + mysql> SELECT at,a.price,(SELECT MAX(b.price)FROM my_table b WHERE bt BETWEEN at - INTERVAL 3 DAY and at - INTERVAL 1 SECOND )from my_table a WHERE date(t)= date(now()); – kido9797 2013-04-22 10:47:13

+0

你無法將表格a和表格b連接在一起嗎?它基本上看起來像是想要從每個表中獲取所有數據並將其放在一個表中,但是SQL不知道如何匹配它。我會嘗試加入,然後選擇*,max(b.price)從...... – 2013-04-22 11:43:04

0

我想試試這個:

select *,(
    select max(b.price) 
    from my_table b 
    where b.t between a.t - interval 3 day and a.t - interval 1 second 
) from my_table a; 

,並確保my_table.t有一個指標:

alter table my_table add index ix_t (t); 
+0

嗨Ross, 感謝您的回答,我在表格中添加了索引,但運行時間仍然很長(更多比15分鐘,我終於不得不打破它)..... 那麼,任何其他解決方案,會跑得更快? – kido9797 2013-04-22 07:10:17

0

這個查詢應工作速度快:

SELECT *, 
    ( SELECT max(b.price) 
     FROM my_table b 
     WHERE b.t > a.t - interval 3 day 
      AND b.t < a.t 
    ) 
FROM my_table a 

,但你需要確保你有mytable(t)索引 - 我認爲這個網絡現場是timestampdatetime

+0

謝謝,請看下面我的回答,仍然沒有解決。 – kido9797 2013-04-22 10:39:41