如果你要必須在MySQL中實現一個鍵值存儲,那麼使它比這更復雜沒有任何意義。
create table key_value_store (
run_time datetime not null,
key_name varchar(15) not null,
key_value varchar(15) not null,
primary key (run_time, key_name)
);
如果你的關鍵字和值兩者的平均長度爲10字節,你看約86萬行,每月2.5GB,你不需要任何連接。如果所有值(列key_value)都是整數或浮點數,則可以更改數據類型並減少一點空間。
一個與SQL實現鍵值存儲的主要問題是,除非所有值都相同的數據類型,你必須使用所有值類似VARCHAR(n)的。你失去了類型安全和聲明約束。 (您不能檢查key3的值是否在1和15之間,而key7的值是在0和3之間。)
這可行嗎?
這種結構(稱爲「EAV」 - 谷歌的那種)是一種衆所周知的餐桌設計反模式。問題的一部分是你基本上將列存儲爲行。 (您在key_value_store.key_name中存儲了列名。)如果您有有史以來必須以正常表的格式寫出數據,您會發現三件事。
- 很難編寫查詢來輸出正確的格式。
- 需要永久運行。如果您必須編寫數百個列,它可能永遠不會完成。
- 你會希望你有更快的硬件。很多,很多更快的硬件。
我尋找什麼
- 機遇組鍵進入邏輯表。這與第一個設計有關,它可能不適用於你。這聽起來就像你的應用程序基本上存儲了一個日誌文件,並且你不知道每次運行哪些鍵會有值。
- 減少行數的機會。我會問,「我們可以少寫一遍嗎?」所以我會考慮每5秒或6秒寫入數據庫,而不是每3秒寫一次,假設這意味着我正在寫更少的行。 (真正的目標是更少的行數,而不是更少的寫入數量。)
- 合適的平臺。 PostgreSQL 9.2可能是更好的選擇。版本9.2具有僅索引掃描,並且它具有實現鍵值存儲的hstore模塊。
測試你決定
如果我是你的話,我會在這兩個MySQL和PostgreSQL構建這個表之前。我會加載大約一百萬行隨機數據。然後,我會嘗試一些查詢和每個報告。 (報告很重要。)衡量績效。將負載增加到1000萬行,重新調整服務器和dbms,然後再次運行相同的查詢和報告。再次測量。
重複1億行。當你有信心時退出。預計這一切需要幾天。
您是否關注通過將相同的時間戳寫入100行所使用的磁盤空間? –
是的。 我的計算是: 100值* 16bytes * 24(h)* 60(min)* 60(s)* 30(month)= 3.8GB /月 –
無論誰建議像這樣存儲不應該推薦數據庫楷模。 – Kermit