繁体   English   中英

为非关键webapp数据选择MySQL表类型(MyISAM与InnoDB)

[英]Choice of MySQL table type for non-critical webapp data (MyISAM vs. InnoDB)

考虑这种情况,假设如下:

  • 该数据库用于非关键Web应用程序。
  • 查询速度至关重要。
  • 读/写模式大约> 95%读取和<5%写入。
  • 每天使用mysqldump备份数据库。
  • 不需要事务或高级崩溃恢复。 如果数据库崩溃,我只需导入昨晚的mysqldump。 在这种情况下,这已经足够了。
  • 无需全文搜索。

在所述假设下MyISAM的优点:

  • 它非常快(有一个例外 - 见下文)。
  • 它重量轻,并且在数据库/表与文件系统中的物理文件(.MYD / .MYI / .frm)之间具有易于理解的映射。
  • 轻松备份(mysqldump)。

总而言之,我对MyISAM非常满意,但有一个例外。 在所述假设下,MyISAM有一个主要缺点,即表级锁定。 当UPDATE向经常读取的表运行时,所有读取都被阻止。 不用说,这会导致必须解决的主要性能问题。

我的问题是:

  1. 有没有办法在不切换MyISAM的情况下摆脱表级锁定?
  2. 如果我必须切换到InnoDB - 我如何配置InnoDB,使其行为尽可能与MyISAM类似(不要考虑事务,逻辑文件结构等)。 如何将InnoDB配置为“就像MyISAM但没有表级锁定”?
  1. 不,MyISAM意味着表级锁定。
  2. 你不能“只是喜欢”它,但你可以通过打开innodb_file_per_table选项让它“更像”。 然而,InnoDB仍会将关键信息存储在其系统级数据文件中,并且您无法通过重命名数据库来重命名数据库,就像使用MyISAM一样。

您是否真的使用myisam和innodb表获取了性能指标? 根据我的经验,当你考虑从innodb获得的所有ACID好处时,速度上的差异并不是那么多。 只是单独锁定表会影响速度,因此innodb总体上会更快。

另请注意,myisam在插入时要快得多,而不是选择。 你只插入5%的时间...做数学。

你总是可以使用innodb做mysqldump,所以你的备份过程是一样的。

我知道有些项目使用镜像DB进行搜索。 它倾向于针对搜索进行优化,有时甚至可以在不同的机器上运行,只是为了隔离开销。

这里唯一的缺点是保持它们同步有点麻烦。 如果搜索表中的陈旧数据不是太麻烦,那么它可能是最好的选择。 如果性能是一个问题。

这不是我最喜欢的解决方案,但理论上它非常简单。

  1. 说到备份InnoDB并不妨碍你使用mysqldump。
  2. 您确定您确实需要维护磁盘上数据库表和文件之间的映射吗? 对数据库文件的手动操作很少是个好主意。
  3. 使用InnoDB,您不必使用事务,默认情况下它以“自动提交”模式工作(每个查询将自动提交)。
  4. “InnoDB速度较慢”现在主要是神话,但当然这取决于你的工作量。

换句话说,我认为你一定要试试InnoDB并对应用程序的性能进行基准测试。 迁移非常简单,所以我没有理由不去尝试。 对我来说,InnoDB很长一段时间都是默认选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM