2012-07-02 79 views
1

我有大量記錄(10,000,每天增加),實質上是一個包含大量數據的報告。所有這些數據,只是數字測量,都需要存儲。MySQL數據庫中大量的列數

問題是,有超過200個這些測量,我需要查詢它們。例如,「對於2012年1月至3月間創建的報告,按性別排序,每個性別的平均身高是多少?」爲了能夠靈活地查詢任何測量結果,每個測量結果都需要自己的列。

現在,我將每個字段存儲在JSON數組中,並將其存儲在單個列中。這對於我沒有完成查詢工具的這部分開發來說很好,但我需要儘快完成這個工作......理論上,我可以從數據庫中提取所有記錄並使用PHP對它們進行排序(當它們是對象或數組),但在處理這麼多行時似乎是不必要的複雜和危險的。

MySQL中的大型(200+)列表中是否存在與成千上萬行有關的任何問題,無論是性能還是數據完整性?或者,有沒有其他辦法可以將的所有內容全部並使用某種服務器端語言進行排序?

我的數據的一些隨機信息:

  • 每個報告已超過200個測量
  • 每個測量需要能夠被查詢
  • 測量大多是整數或浮點數,但有是幾個字符串
+1

每桌有4,096列的硬限制,但可以通過其他存儲因素來減少。 MySQL不應該列出200列,但你有一些設計決策。也許有50列與其他150列有根本的不同,所以你可以將它們分成兩個表,它們有一個具有唯一標識符的列將它們映射到一起(這將存在於父表中)。 –

+0

我知道硬限制,但我不確定200是否會成爲性能問題。 –

回答

1

好的,我看到你的dialemma,並且在(大概是短暫的)缺少數據庫專家的情況下,我會給你我的看法。

爲了理智分手您的數據。比方說,你正在存儲信息的人。 1桌不需要200列。你應該把它們分開,並在很多表中有多個列。例如

tblGeneralCharacteristics: 
- colEyeColor 
- colHairColor 
- colHeight 
- colWeight 

tblInterests: 
- colFaveColor 
- colFaveSport 

tblRelationships 
- colMother 
- colFather 
- colBrother 
- colSister 

這種方式好多了。從計算角度來說,我懷疑這很重要。顯然,對於每個查詢,您的數據都會減少,因此對於某些報告(您可能不需要獲取所有數據或拖動所有數據)可能會更快(但如果您正確地爲數據庫建立索引,則它應該不是問題)。

下一個問題。數據庫中的記錄數量。如果10,000開始有點大,那麼就開始緩存。

現在,就我而言,沒有正確或錯誤的方式來緩存數據。你需要的是你需要的。因此,舉個例子,在你提到的問題中提到2012年3月的&之間的記錄輸入的平均高度爲重量。呃...你可以編寫一個cron腳本來計算當月所有記錄的平均權重高度,並將其存儲在不同的表中。然後,當你來創建你的報告時,你只需要獲得Jan,Feb & March的值,然後平均他們......這就容易多了。而不是在可能的數千行上進行計算查詢,而是在幾百行上執行cron查詢(這無關緊要),然後實際報告只查詢3行。

另一個訣竅是,您可以在SQL中執行的計算越多越好。如果你想平均字段/記錄,或總計東西,然後發送你的SQL查詢。 SQL服務器將執行計算並返回結果,而不是返回大量數據進行篩選。我知道這並不總是很簡單/有用,但你可以讓SQL越做越好。

希望這會有所幫助。就像我說過的,我確信數據庫專家很想給你一些更有見地的建議。 :)

+0

感謝您的建議:)雖然我不完全確定要分手。每個測量的名稱都像Excel單元格(B12),所以從可讀性的角度來看沒有任何意義。這些全都映射到身高,體重,年齡等,但從查看數據庫並不清楚 - 您必須查看我必須將他們的鍵映射到測量類型的陣列。如果可能的話,我寧願把所有東西都放在一張桌子上,而不是讓事情變得複雜。 –

1

將它們分開存儲。 Mysql每個表的限制爲4096列,每行的限制爲65536個字節。你不會用主要是數字數據和一些字符串來達到目的。

你不應該在php中做任何數據操作,這是sql發光的地方。 200列和10,000行在事物的宏偉計劃中相當小,只要正確索引您的表,並且即使您沒有,表現也應該很好。