2014-04-01 82 views
0

我正要將數百萬行插入到數據庫中。是否有一張桌子上有很多列,或多或少具有多行多行的表格?用於優化具有數百萬行和大量列的表的選項

的數據看起來有點像這樣:

user Jan01 Jan02 Jan03 ... 
abcdef 459232 958394 319348 
ghijkl 583941 813941 438923 
mnopqr 681294 249393 934304 
... 

我想過每月打破它,但隨後我將結束與數百萬行的約60桌。每年打破它,仍然會使表格每個結果在〜365列。如果我達到這個程度,我認爲我可能只有一張表,因爲這樣可以節省空間並完全消除冗餘(這在編程中總是很好的)。

但是,有一張〜365 *〜60列的表聽起來很瘋狂。

是否有某種功能或某些方法可以解決我不知道的問題?你會怎麼做?

+0

您可能需要規範化該表。你存儲什麼樣的數據?它將如何被訪問?您提供的數據越多,我們可以提供的最好幫助。 –

回答

1

你應該讓表格長而不是寬。

如果你把表:

user | date | data 

,那麼你的查詢會快很多。

您還需要確保正確索引列。

終於不使用varchar等,如果你能避免它 - 如果你知道一個列的長度,這將永遠是一個integer確保它是類型:integer Length 11(或其他),因爲這將大規模加快查詢速度。

編輯

,使這個更容易理解你的表應該是

user  | date  | data 

abcdef  Jan01   459232 
abcdef  Jan02   958394 
abcdef  Jan03   319438 
ghijkl  Jan01   583941 
ghijkl  Jan02   813941 
ghijkl  Jan03   438923 
mnopqr  Jan01   681294 
mnopqr  Jan02   249393 
mnopqr  Jan03   934304 

這可以讓你有效地查詢數據,插入和更新數據更容易,更是數據庫是如何設計的(長不寬)。

即使有600萬行,它仍然會比60列100000行的表更快。

+0

我不完全明白爲什麼每個人都說很長而且不寬。我的問題是問我是否應該有多個相同長度的表格,或者是否有一張長度相同但寬度很大的表格。 – Whatever

+0

我想說的是有一張很長的表 - 只有三列'用戶,日期和數據'你不需要多個表 - 只有一個很長的表(想想它是這樣的,你有用戶:表中的數據 - 如果每個日期有不同的表格,第三列'日期'就是您的表格名稱。) –

+0

修改了答案以解釋爲什麼要這樣做。 –

1

製作一張有很多行的表格。不要被任何東西分解。

如果真的變得太大,你可以partition吧。

0

我同意其他兩張海報 - 表格比「寬」更好地「長」。

索引,聚集索引,位圖,臨時表,鎖定,交易日記記錄&所有其它多年的研究&數據庫的複雜的算法被設計爲運行&在垂直方向上選擇 - 向下行。

去廣泛,你扔掉所有的機制,使數據庫的工作,並給它良好的性能。

寫入365 * 60列可能會超過您的數據庫的最大行數限制;但如果沒有,讀取/寫入/更新任何東西都需要訪問所有受影響或不可排除的行(大約131 KB)。這裏有一些好處,爲您的娛樂:

  • 數據項不能再逐步插入;你需要立即寫一整行。
  • 索引將基本上不適用。告別演出。
  • SQL &準備陳述退化..現在必須專門爲(月,年)列涉及。
  • 告別用戶不同年份的報告,不同年份的用戶報告等等,以任何簡單的方式。
  • 現在,任何不平凡的查詢/報告都需要對整個數據集進行表掃描。數百萬行,你說?告別用戶在不同年份的報告,不同年份的用戶報告等等。
  • 如果有什麼會破壞數據庫的內部緩衝區,日誌或事務日誌或數據庫驅動程序 - 這可能是一個很好的發現:)獲取友好的意外的技術限制&不尋常的失敗案例。

所以,既不容易,也不是性能:)但值得考慮,因爲這有助於給出一個例子&瞭解數據庫實際上做了什麼。

希望你發現這個有趣!

相關問題