2014-01-24 38 views
2

我想知道是否有人可以幫我解答這個技術問題。我有一份在一年中任何給定日期/時間可以或不可能發生的事情清單。假設有一百萬件物品。爲了簡化起見,我們可以說這件事一年365天每隔半小時就能發生或不可能發生。因此有17,520個可能的二進制值。我需要實時查詢這件事,以確定在x時是否會發生某些事情。出於顯而易見的原因,創建具有17,520列的表格效率不高。如何在mysql中對代碼日期進行高效查詢

任何人都可以推薦任何方法,讓我來處理這些數據?謝謝。

+0

大多數情況下,他們可以或不可以在某個時間點發生?例如,在17.520比特中,在avarage上有多少將是1,多少將是0? – GolezTrol

回答

1

我建議使用類似於位圖的東西來存儲這種類型的數據。

這應該很容易操作,並將有效地存儲(可能壓縮)。

檢索事件的位圖,並與您的時隙「與」。瞭解它是否是有效的時間。

0

根據事件發生的次數/不發生,我建議保存給定測量中的日期之間的差異(半小時,我猜?)。如果有很多時候沒有發生,那麼你可以節省它發生的時間,並跳過它沒有發生的時間。

實施例,

,如果你有

V = 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1

可以將其保存爲

V2 = 0 2 0 4 0 0 4 1 2 4

如果將其保存爲比int小的東西,則這在空間中也可以是有效的。

0

我建議創建一個時間間隔維度表,17520個記錄,您可以使用這些記錄來創建報告,例如在什麼時候流逝,什麼也沒有發生。

請記住,更多低效的是許多列表,而不是像這樣的兩列或三列表,但長記錄。

0

3個表:

表1:事情(ID,thingname)

表2:所有可能的時間的事情(S)從表1中可以發生的次數 - (ID,時間)

表3:東西映射表 - >時候,他們可以發生thing_times(thing_id,TIME_ID)如果你想看看最多可事情發生X在時間

Ÿ

select * from thing_times inner join times on thing_times.timeid = times.id inner join 
things on thing_times.thingid = things.id where times.time = $canItHappenTime and 
things.thingname = $thingIWantToCheckTimeFor 

或者你可以離開了加入到Table 1,如果你已經知道的東西的ID

還,請確保您的列添加索引(thingname和時間),所以查詢沒有您正在搜索必須做表掃描...

0

執行此操作的SQLish方式是將表中的行記錄在表中,大致類似於此,其中包含事件名稱和時間戳記。

event  | when 
    happened | 2014-01-01 10:13 
    happened | 2014-01-01 10:33 
    didnt  | 2014-01-01 11:13 

然後,由每小時昨天得到事件的一個總結,你可以這樣做:

SELECT DATE_FORMAT(when,'%Y-%m-%d %H:00') AS when, 
     SUM(IF('happened'=event,1,0)) AS happened, 
     SUM(IF('didnt'=event,1,0)) AS didnt 
    FROM event 
    WHERE when >= CURDATE() - INTERVAL 1 DAY 
    AND when < CURDATE() 
    GROUP BY DATE_FORMAT(when,'%Y-%m-%d %H:00') 
    ORDER BY DATE_FORMAT(when,'%Y-%m-%d %H:00') 

這裏的一些注意事項:DATE_FORMAT(when,'%Y-%m-%d %H:00')表達減少日期最接近的小時。 WHERE表達式提供了從昨天午夜到今天午夜不包括的所有內容。

如果您想通過半小時的總結,用這個GROUP BY表達式來代替:

DATE_FORMAT(obstime,'%Y-%m-%d %H:00') + 
      INTERVAL (MINUTE(obstime) - MINUTE(obstime) MOD 30) MINUTE 

在SQL世界上就沒有必要編碼這種時間序列數據的像位串hyperoptimized數據結構。在所有現代計算機中基本上都是這樣;磁盤空間確實很便宜。