MySQL + MyISAM表大小问题

时间:2010-05-25 15:40:36

标签: mysql myisam

我有一张测试表。测试表如下:

CREATE TABLE  `mytest` (
  `num1` int(10) unsigned NOT NULL,
  KEY `key1` (`num1`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我在此表中插入了5000万行。

当我显示表状态时,avg_row_length是7.我希望看到4,因为mySQL使用4个字节作为整数。密钥是否对avg_row_length有影响?当我查看我的.MYD文件时,它的大小是334 MB,这正是avg_row_length为7时应该给出的,但是我真的希望看到190 MB,因为我只有一个int。

+----------------+--------+---------+------------+----------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
| 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         | MyISAM |      10 | Fixed      | 50000000 |              7 |   350000000 | 1970324836974591 |    600518656 |         0 |           NULL | 2010-05-22 09:15:06 | 2010-05-22 19:32:53 | NULL       | latin1_swedish_ci |     NULL |                |         |

我已经为mytest表包含了show table status的输出。抱歉格式化:D 提前谢谢!

Alessandro Ferrucci

1 个答案:

答案 0 :(得分:2)

我认为问题在于MySQL默认使用的指针大小。

来自MySQL reference的引文:

  

<强> AVG_ROW_LENGTH

     

表格的平均行长度的近似值。您只需为具有可变大小行的大型表设置此项。

     

当您创建MyISAM表时,MySQL使用MAX_ROWS和AVG_ROW_LENGTH选项的乘积来确定结果表的大小。如果未指定任一选项,则默认情况下,MyISAM数据和索引文件的最大大小为256TB。 (如果您的操作系统不支持较大的文件,则表大小受文件大小限制的限制。)如果您想要保持指针大小以使索引更小更快而且您不需要大文件,那么可以通过设置myisam_data_pointer_size系统变量来减小默认指针大小。 (请参见第5.1.4节“服务器系统变量”。)如果您希望所有表都能够超过默认限制并且愿意让您的表稍微慢一点,那么您可以增加默认指针大小通过设置此变量。将值设置为7允许表格大小最大为65,536TB。

尝试在创建表格时使用MAX_ROWSAVG_ROW_LENGTH,或者使用ALTER TABLE语句设置,并查看是否有帮助。