簡體   English   中英

mysql - 創建行與列性能

[英]mysql - Creating rows vs. columns performance

我構建了一個分析引擎,從我的數據庫中提取50-100行原始數據(讓我們稱之為raw_table ),在PHP上運行一系列統計測量,然后提出140個數據點,然后我需要存儲在另一個表中(我們稱之為results_table )。 所有這些數據點都是非常小的整數(“40”,“2.23”,“ - 1024”是數據類型的好例子)。

我知道mysql的最大列數非常高(4000+),但是當性能真正開始降低時,似乎有很多灰色區域。

這里有一些關於最佳性能實踐的問題:

1)如果更好,140個數據點可以分成20行7個數據點,如果更少的列更好,則所有數據點都具有相同的“ experiment_id ”。 但是我總是需要拉動所有20行(每行7列,加上id等),所以我不認為這比拉動1列140列更好。 所以問題是:最好存儲20行7-9列(這些都需要一次拉出)或1行140-143列?

2)鑒於我的數據示例(“40”,“2.23”,“ - 1024”是將要存儲的內容的良好示例)我正在考慮結構類型的smallint 那里的任何反饋,表現方面還是其他方面?

3)歡迎任何有關mysql性能問題或提示的其他反饋。

提前感謝您的意見。

我認為存儲更多行(即標准化)的優勢取決於面對變化時的設計和維護考慮因素。

此外,如果140列具有相同的含義或每個實驗不同 - 根據規范化規則正確建模數據 - 即數據如何與候選鍵相關。

就性能而言,如果使用所有列,則會產生很小的差異。 有時,對於大量數據,pivot / unpivot操作可能是昂貴的,但它對單個密鑰訪問模式幾乎沒有什么區別。 有時,數據庫中的數據透視表可以使您的前端代碼更加簡單,並且后端代碼在變更時更加靈活。

如果你有很多NULL,那么可以消除規范化設計中的行,這樣可以節省空間。 我不知道MySQL是否支持稀疏表概念,它可以在那里發揮作用。

每次返回140個數據項,每個類型為double。

這對於1x140或20x7或7x20或4x35等沒有實際區別。對於一種形狀當然可以無限快,但是你考慮了PHP代碼中處理不同形狀的額外復雜性。

您是否有經過驗證的瓶頸,或者這只是隨機過早優化?

您沒有建議您打算在數據庫中存儲大數據,但出於這個論點的目的,我假設您有10億(10 ^ 9)個數據點。

如果將它們存儲在140列中,則只有7行,但是,如果要從大量實驗中檢索單個數據點,則必須獲取大量非常寬的行。

這些非常寬的行將占用你的innodb_buffer_pool中更多的空間,因此你將無法緩存這么多; 當您再次訪問它們時,這可能會減慢您的速度。

如果每行存儲一個數據點,在列數很少的表(experiment_id,datapoint_id,value)中,則需要拉出相同數量的較小行。

但是,行的大小對所需的IO操作數量幾乎沒有影響。 如果我們假設您的10億個數據點不適合ram(現在這不是一個安全的假設),那么結果性能可能大致相同。

使用少量列可能是更好的數據庫設計; 但是如果使用大量的列,它將使用更少的磁盤空間並且可能更快填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM