我已經在MySQL下表:MySQL表的大小不匹配我的計算
CREATE TABLE `ParaTable` (
`id_1` INT(10) UNSIGNED NULL DEFAULT '0',
`id_2` INT(10) UNSIGNED NULL DEFAULT '0',
`id_3` TINYINT(3) UNSIGNED NULL DEFAULT '0',
`id_4` TINYINT(3) UNSIGNED NULL DEFAULT '0',
`id_5` INT(10) UNSIGNED NULL DEFAULT '0',
`date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
INDEX `id_1` (`id_1`),
INDEX `id_2` (`id_2`),
INDEX `date` (`date`),
INDEX `id_3` (`id_3`),
INDEX `id_4` (`id_4`),
INDEX `id_5` (`id_5`),
INDEX `multi_index` (`id_1`, `id_3`, `id_4`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
它有大約7000萬項的總數,即使列是空的,沒有一個項目有一個NULL
在任何列(這裏的表結構不是問題)。
如果我考慮information_schema
,我可以看到,索引長度爲10272899072和數據長度是3201302528.
這使得共12,850MB的,或約12.54GB。
這個數字是如何計算的?
的SHOW TABLE STATUS ... LIKE ParaTable
顯示輸出:
Rows: 68129609
Avg_row_length: 47
Data_length: 3201302528 (=3053MB)
Index_length: 10272899072 (=9797MB)
我讀到的數據存儲大小in the MySQL manual,並已提出了以下粗略計算:
(INT + INT + TINYINT + TINYINT + INT +時間戳)
(+ 6位,因爲每列可以爲空,我假設我可以將這6位計算爲另一個字節並且是安全的,請參閱 the manual)4 + 4 + 1 + 1 + 4 + 4 = =每行19個字節。
(即使每個6位的取盤,這是不可能的我猜1個字節,這將是每行24個字節)。
18 bytes * 70,000,000 rows = 1260000000B = ~1200MB
(19 bytes * 70,000,000 rows = 1330000000B = ~1270MB)
(24 bytes * 70,000,000 rows = 1680000000B = ~1600MB)
我不知道有多少空間MySQL的需要爲索引(我只能從SHOW TABLES
的值,但它是如何計算的?)。這是計算所需總尺寸時缺少的一個環節。但即使指數與它沒有任何關係,單靠Data_length
似乎也太高了。
爲什麼Avg_row_length
47而不是我計算的18-24字節?我在這裏錯過了什麼?
嗨,jeremy,謝謝你解釋和鏈接!這現在開始有意義了:D – para