2009-07-31 63 views
1

我想開發一個時間卡應用程序。 因此,每個月都會有30天或31天。 (包括字段AM-IN,AM-OUT,PM-IN,PM-OUT等),這是一個VARCHAR(4500)在mysql中MYSQL性能

我的想法是存儲這個一個月的數據(30天)進入數據庫中的一行。 我以XML格式存儲30天的數據。所以只選取一行。

一切都很完美。它運作良好。

客戶期待100萬用戶使用此時間卡。現在問題出現在我創建壓力數據時。我爲3百萬用戶創造了3年的壓力數據。 已創建完整(100萬* 12個月* 3)號碼行。該應用程序工作正常。但是,當我看到磁盤使用情況時,此表消耗50 GB。我相信這50GB的消耗量是因爲VARCHAR(4500)。如果我把它分解成單獨的列,這個問題不會在那裏。

這是我的問題。 如果我打破時間卡VARCHAR(4500)進入獨立的領域,我將存儲每天的行。所以存儲的行數將是(100萬* 12個月* 30天* 3)

在實時情況下(10,000個用戶並行訪問此時卡頁面) tomcat + mysql是否可以處理10,000個並行請求(我的意思是每次獲得30條記錄)?

數據模態到在單排
或 2)在30行中存儲1個月的數據使用 1)存儲1個月的數據?

+0

您能否舉一個您針對您的數據發佈的查詢示例? – Quassnoi 2009-07-31 12:03:05

回答

1

恕我直言,我會去你的第二個數據模型。 (每天的數據行)將數據分解成單獨的列更有意義,並且可以使您更好地進行數據驗證,索引,效率等。這看起來像使用基於日期的分區的一種很好的情況,可以將分區從主數據表的背面滾開,並將它們存儲在較低成本的存儲器中,或按照意大利的建議將它們導出到文件中。這應該使您的表保持可管理的大小並提供更好的查詢性能。我建議您閱讀針對MySQL的不同存儲引擎選項,因爲它們的實現方面可能會根據您需要的吞吐量大幅改變性能。

0

數據模態到在單行中使用1)存儲1個月 數據或2) 在30行中存儲1個月的數據?

以最快的方式存儲當前月份。

以最有意義的方式歸檔前幾個月(哎呀,我甚至會將數據導出到一個文件,這是純粹的只讀數據)。

0

在實時情況下(10,000個用戶同時訪問此卡頁面)tomcat + mysql是否可以處理10,000個並行請求(我的意思是每次獲取30條記錄)?

沒有演出]是依賴於緩存的水平,如果每個用戶訪問的每個時間(完全隨機的)不同卡 ,你有DB的50G讓你將硬盤界,不,你不會無論如何都能從磁盤的不同位置在一秒鐘內獲取10K條記錄。

另一方面,99.9%的用戶只訪問最近的條目,所以50/12/3〜= 1.5G頻繁訪問數據,所以它存儲在內存緩存中,您可能有機會在有大量內存和CPU的計算機上爲每個用戶提取10K個請求,但我認爲你不能在並行請求中這樣做,因爲MySQL每個連接都有線程。

在任何情況下,您可能需要準備將數據庫分區到多個服務器,因此您可以在內存中擴展和實現高效的條目緩存。

編輯在任何情況下,如果你嘗試只存儲鍵/值數據,無需額外的索引,我會建議PIC簡單的東西,然後完整的關係數據庫,採取http://memcachedb.org/一看,還是單獨的歸檔存儲和存儲可以更新 - 因爲未更新的存儲可能以不同方式存儲。