【发布时间】:2011-02-24 06:18:37
【问题描述】:
我正在尝试找出不同存储引擎的存储要求。我有这张桌子:
CREATE TABLE `mytest` (
`num1` int(10) unsigned NOT NULL,
KEY `key1` (`num1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
当我插入一些值然后运行 show table status; 时,我得到以下信息:
注意 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 字节的 unsigned int 时需要这么大的 avg_row_length?
【问题讨论】:
-
我刚刚读到 InnoDB 将表空间用于数据和索引。这是有道理的,似乎这就是我看到如此大的 avg_row_length 的原因......也许。我还发现每个叶子节点都存储了事务 ID 和回滚指针。好吧,我本身并没有使用交易,因此对这些数据没有用处。有没有办法不存储这些值?有什么方法可以使用 InnoDB,但可以更好地利用存储?谢谢!
-
@alessandro:是的,事务支持也确实增加了一些开销。您没有使用事务这一事实并不意味着它们没有被使用:例如,在长时间的
UPDATE操作期间被杀死的线程将在InnoDB中正确回滚,但在MyISAM中不会正确回滚。事务支持是使用InnoDB的重点,如果你不需要它,只需使用MyISAM。 -
@Quassnoi:我的印象是 MyISAM 不像 InnoDB 那样“成熟”或生产就绪……也许这是一种毫无根据的恐惧。除了 MyISAM 需要全表锁来保证一致性之外,MyISAM 在备份数据库时是否会给表带来任何困难。我不需要交易,我将存储大量数据。 MyISAM 是否有任何已知问题会导致您不使用它?
-
@alessandro:“不需要交易”到底是什么意思? en.wikipedia.org/wiki/ACID 的哪一部分你不需要?
-
@alessandro:是的,我已经在生产环境中部署了数百个 MyISAM 数据库。至于提示,在不知道您的要求的情况下,在一篇文章中推荐的提示太多了。阅读mysqlperformanceblog.com 了解系统管理技巧,阅读我的博客explainextended.com/category/mysql,了解高效
SQL。