2012-02-05 80 views
3

嗨我正在創建一個非常大的表使用DECIMAL數據類型。它將從那裏開始並增長5000萬行,所以我關心存儲。我需要DECIMAL,因爲我需要精確的表示,並且文檔很清楚,如果您想要精確表示,則必須使用DECIMAL。Mysql DECIMAL存儲

MySQL手冊是DECIMAL存儲請求數相當清楚,說明:

在MySQL 5.0.3的,對於DECIMAL列中的值使用包9個十進制(基體10)的數字成四個字節的二進制格式表示。整數和每個值的小數部分的存儲是分開確定的。九位數的每個倍數需要四個字節,「剩餘」數字需要四個字節的一小部分。超出數字所需的存儲空間由下表給出。

剩位數字節數

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

所以這意味着一個DECIMAL(12,4)將需要:

8個字節的整數部分和2個類型fo r'剩餘'部分共10個字節。

所以第一個問題是,不會DECIMAL(18,4)使用相同的10個字節的存儲?如果我想節省存儲空間,那麼我需要將其降至DECIMAL(9,4),這對我來說不是一種選擇。

如果是這樣,第二個問題任何想法,如果mysql處理DECIMAL(12,4)更有效率(內部)比DECIMAL(18,4)?我不認爲這個問題必然是可以回答的,但是我想我會給它一個機會!也許有人已經做了某種基準...

thx。

回答

-1

不用太多考慮,我相信ybercube有正確的答案。話雖如此,難道你不能直接通過創建表格並做一些插入來輕鬆地測試它嗎? 「顯示錶狀態」應該可能有你需要的信息。

+0

如果不知道「節目表狀態」是一種能夠確定性地看錶行大小的方式。有可能是這列「AVG_ROW_LENGTH」。我想這就是所謂的情況下,有表中的VARCHAR()列的平均值。也許對於沒有varchar()的表格,那麼「Avg」並不是一個平均值 - 我會按照你的建議Thx做一些測試。 – 2012-02-06 02:33:35

+0

我只是建議從一個空表,將單行填充所有可能的數據最大和節目表狀態應該告訴你,行的大小(即表中的唯一行)。也許我錯了? – StudyOfCrying 2012-02-06 17:06:34

+0

你是對的!這工作完美。我嘗試使用不同的DECIMAL(x,y)列創建表,插入數據並使用'show table status'來查看長度是多少。謝謝! – 2012-02-08 02:51:26

3

你有你的計算錯誤。

如果我理解正確你鏈接到網頁描述,一個DECIMAL(12,4)將需要:

的整數部分爲8位,所以4個字節

小數部分爲4位,所以2個字節。

總共是6個字節。

對於DECIMAL(18,4),它有14個整數和4個小數位,它需要(4 + 3)+(2)= 9個字節。

+0

我解釋說「9個數字的每個倍數需要4個字節」的文檔來表明分配是以4個字節的倍數完成的。所以9個整數數字需要4個字節,如果轉到10個整數數字,存儲將跳轉到8個字節。意思是,增量是4個字節。如果我在這方面有錯誤,那將是有用的信息,以瞭解答覆的答案! – 2012-02-06 00:30:36

+0

哦,通過我看到在計算DECIMAL(12,4)存儲我的錯誤,你確實是正確的是6個字節.. – 2012-02-06 00:32:36