我想知道是否有人可以幫我解答這個技術問題。我有一份在一年中任何給定日期/時間可以或不可能發生的事情清單。假設有一百萬件物品。爲了簡化起見,我們可以說這件事一年365天每隔半小時就能發生或不可能發生。因此有17,520個可能的二進制值。我需要實時查詢這件事,以確定在x時是否會發生某些事情。出於顯而易見的原因,創建具有17,520列的表格效率不高。如何在mysql中對代碼日期進行高效查詢
任何人都可以推薦任何方法,讓我來處理這些數據?謝謝。
我想知道是否有人可以幫我解答這個技術問題。我有一份在一年中任何給定日期/時間可以或不可能發生的事情清單。假設有一百萬件物品。爲了簡化起見,我們可以說這件事一年365天每隔半小時就能發生或不可能發生。因此有17,520個可能的二進制值。我需要實時查詢這件事,以確定在x時是否會發生某些事情。出於顯而易見的原因,創建具有17,520列的表格效率不高。如何在mysql中對代碼日期進行高效查詢
任何人都可以推薦任何方法,讓我來處理這些數據?謝謝。
我建議使用類似於位圖的東西來存儲這種類型的數據。
這應該很容易操作,並將有效地存儲(可能壓縮)。
檢索事件的位圖,並與您的時隙「與」。瞭解它是否是有效的時間。
根據事件發生的次數/不發生,我建議保存給定測量中的日期之間的差異(半小時,我猜?)。如果有很多時候沒有發生,那麼你可以節省它發生的時間,並跳過它沒有發生的時間。
實施例,
,如果你有
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小的東西,則這在空間中也可以是有效的。
我建議創建一個時間間隔維度表,17520個記錄,您可以使用這些記錄來創建報告,例如在什麼時候流逝,什麼也沒有發生。
請記住,更多低效的是許多列表,而不是像這樣的兩列或三列表,但長記錄。
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和時間),所以查詢沒有您正在搜索必須做表掃描...
執行此操作的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數據結構。在所有現代計算機中基本上都是這樣;磁盤空間確實很便宜。
大多數情況下,他們可以或不可以在某個時間點發生?例如,在17.520比特中,在avarage上有多少將是1,多少將是0? – GolezTrol