我正在试图找出不同存储引擎的存储要求.我有这张桌子:
CREATE TABLE `mytest` (
`num1` int(10) unsigned NOT NULL,
KEY `key1` (`num1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
当我插入一些值然后运行show table status;我得到以下内容:
+----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+----------------+--------+---------+------------+---------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| mytest | InnoDB | 10 | Compact | 1932473 | 35 | 67715072 | 0 | 48840704 | 4194304 | NULL | 2010-05-26 11:30:40 | NULL | NULL | latin1_swedish_ci | NULL | | |
注意avg_row_length是35.我感到困惑的是,当我只存储一个不可为空的整数时,InnoDB不会更好地利用空间.
我在myISAM上运行了同样的测试,默认情况下myISAM在这个表上每行使用7个字节.当我跑
ALTER TABLE mytest MAX_ROWS=50000000, AVG_ROW_LENGTH = 4;
导致myISAM最终正确使用5字节行.
当我为InnoDB运行相同的ALTER TABLE语句时,avg_row_length不会改变.
为什么只存储一个4字节的无符号整数时需要这么大的avg_row_length?