【问题标题】:MyISAM and InnoDB tables in one database一个数据库中的 MyISAM 和 InnoDB 表
【发布时间】:2011-01-08 00:59:43
【问题描述】:

我有一个包含大约 30 个表的数据库,其中 5 个表是写密集型的。

我正在考虑

  1. 将 5 个写入密集型表转换为使用 InnoDB 引擎,并将其余表保留在 MyISAM 引擎上

  2. 将所有表转换为使用 InnoDB 引擎。

我想知道哪种方法更好?

更具体

我想在 MyISAM 引擎上保留一些表的原因是其中一些表大约有 1,000,000 行。我不确定转换为 InnoDB 后这些表上的“SELECT COUNT(*)”之类的查询会有多慢。

我没有做过测试。在开始转换之前,我希望得到你们任何人的一些建议。

【问题讨论】:

  • 为什么不拥有两全其美:MySQL PBXT?

标签: mysql innodb myisam


【解决方案1】:

这些天来,我总是默认使用 InnoDB,尤其是在您提到的 MyISAM 遭受全表锁定的写入密集型表上。这是一个中肯的比较。

使用 MyISAM 的原因:

  • 表对于选择繁重的负载来说真的很快
  • 表级锁限制了它们在写入密集型多用户环境中的可扩展性。
  • 最小的磁盘空间消耗
  • 全文索引
  • 合并和压缩表。

使用 InnoDB 的原因:

  • ACID 交易
  • 行级锁定
  • 一致的读取 - 让您达到出色的读写并发性。
  • 主键集群 - 在某些情况下提供出色的性能。
  • 外键支持。
  • 索引页和数据页都可以缓存。
  • 自动崩溃恢复 - 如果 MySQL 关闭不干净,InnoDB 表仍会 - 恢复到一致状态 - 可能不需要像 MyISAM 那样的检查/修复。
  • 所有更新都必须通过 InnoDB 中的事务引擎,与非事务存储引擎相比,这通常会降低性能。

以上内容来自this site,它似乎不再有效。

【讨论】:

  • 您对 COUNT(*) 的后续关注是有根据的。 InnoDB 不保留表中行的内部计数,因此执行 SELECT COUNT(*) 会执行全表扫描。虽然这样的查询不需要使用 MyISAM 的时间,但等效的 InnoDB 查询可能需要几秒钟才能处理 100 万行。典型的解决方案是维护另一个“计数器表”,您可以在其中手动递增和递减,具体取决于您是插入还是删除了可计数的行。您可以在此处找到更多信息:dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html 在“显示表状态”下。
【解决方案2】:

各有优缺点。

对于 (1) 优点:更少的磁盘空间使用,myisam 读取重的访问模式更快

缺点:内存必须在 innodb 缓冲区和 myisam 键缓冲区之间共享。 innodb 表比 myisam 表大 4 倍。程序代码必须适应死锁处理。

请记住,如果您要更改索引列或主键,innodb 也会锁定。

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多