1

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

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 在此先感谢!

亚历山德罗·费鲁奇

4

1 回答 1

2

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

来自MySQL 参考的引用

AVG_ROW_LENGTH

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

创建 MyISAM 表时,MySQL 使用 MAX_ROWS 和 AVG_ROW_LENGTH 选项的乘积来决定生成的表有多大。如果您不指定任一选项,默认情况下 MyISAM 数据和索引文件的最大大小为 256TB。(如果您的操作系统不支持那么大的文件,则表大小受到文件大小限制的限制。)如果您想降低指针大小以使索引更小更快,并且您实际上并不需要大文件,您可以通过设置 myisam_data_pointer_size 系统变量来减小默认指针大小。(请参阅第 5.1.4 节,“服务器系统变量”。)如果您希望所有表都能够增长到默认限制以上,并且愿意让您的表稍微慢一些并且比必要的大,您可以增加默认指针大小通过设置这个变量。

尝试设置MAX_ROWSAVG_ROW_LENGTH自己创建表或使用ALTER TABLE语句,看看是否有帮助。

于 2010-05-25T17:36:02.950 回答