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

时间:2009-07-07 18:26:21

标签: sql mysql database optimization

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

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

在所述假设下MyISAM的优点:

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

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

我的问题是:

  1. 有没有办法摆脱桌面级锁定而不必离开MyISAM?
  2. 如果我必须切换到InnoDB - 如何配置InnoDB,使其行为尽可能与MyISAM类似(不要考虑事务,逻辑文件结构等)。如何将InnoDB配置为“就像MyISAM但没有表级锁定”?

4 个答案:

答案 0 :(得分:1)

  1. 不,MyISAM表示表级锁定。
  2. 你不能“只是喜欢”它,但你可以通过启用innodb_file_per_table选项“更加喜欢”它。然而,InnoDB仍会将关键信息存储在其系统级数据文件中,并且您无法通过重命名数据库来重命名数据库,就像使用MyISAM一样重命名数据库。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

  1. 说到备份InnoDB并不妨碍你使用mysqldump。
  2. 您确定您确实需要维护磁盘上数据库表和文件之间的映射吗?对数据库文件的手动操作很少是一个好主意。
  3. 使用InnoDB,您不必使用事务,默认情况下它以“自动提交”模式工作(每个查询都将自动提交)。
  4. “InnoDB速度较慢”现在主要是神话,但当然这取决于你的工作量。
  5. 换句话说,我认为你一定要试试InnoDB并对应用程序的性能进行基准测试。迁移非常简单,所以我没有理由不去尝试。对我来说,InnoDB很长一段时间是默认选择。