2010-01-05 74 views
5

我们正在运行一个社交网站,记录每个成员的行为(包括访问其他成员的网页);这涉及到很多写入数据库。这些操作存储在MyISAM表中,并且由于开始对CPU征税,我首先想到的是MyISAM的表锁定导致了CPU的压力。将MyISAM转换为InnoDB。有利?后果是什么?

  • 只有读取和写入,没有对此表的更新。我认为读取和写入之间的平衡大约是50/50,因此InnoDB会是更好的选择吗?
  • 如果我想将表更改为InnoDB,并且我们不使用外键约束,事务或全文索引 - 我需要担心什么吗?
+0

http://stackoverflow.com/questions/20148/myisam-versus-innodb – Bozho 2010-01-05 13:01:13

+0

这不是上述的重复,因为它涉及迁移而不是本身的好处。 – MarkR 2010-01-05 13:33:20

+0

您还可以使用混合表格,使MyISAM保留用于读取繁重的表格和InnoDB的日志。不过,我个人今天不会使用MyISAM(真的只有全文searchbait)。 – bobince 2010-01-05 13:56:44

回答

7

尽管在其他线程(MyISAM versus InnoDB)中讨论过使用它的任何优点/缺点,但迁移是一个不平凡的过程。

考虑

  • 功能测试其谈话如果可能,数据库中的所有组件 - 差分引擎有不同的语义
  • 运行尽可能多的性能测试,你可以 - 有些东西可以改善,其他人可能会更糟糕。一个众所周知的例子是大表上的SELECT COUNT(*)。
  • 检查所有代码将正常处理死锁 - 你可以让他们没有明确的用途交易
  • 估计有多少空间的使用,您将通过转换得到的 - 在非生产环境中进行测试。

您将无疑需要在大型软件平台上进行更改;这是可以的,但看到你(希望)有很多自动测试覆盖,改变应该是可以接受的。 PS:如果“某物开始对CPU征税”,那么你应该a)在非生产环境中找出什么,b)在非生产环境中尝试各种减少它的选项。当你没有完全分析问题时,你不应该盲目地开始做重大事情,比如更改数据库引擎。

所有的性能测试都应该在非生产环境中进行,具有类似生产的数据和生产级硬件。否则,很难正确解释结果。

+1

非常感谢这个信息。你能否详细说明“不同的语义”? – stef 2010-01-05 14:12:14

2

我认为很有可能切换到InnoDB会提高性能,但根据我的经验,在尝试之前无法确定。如果我是你,我会在同一台服务器上建立一个测试环境,转换成InnoDB并运行基准测试。

4

至于其他潜在的迁移问题:

1)空间 - InnoDB表往往需要更多的磁盘空间,但对于InnoDB的新版本梭子鱼的文件格式已经缩小差别。通过转换表格的最近备份并比较大小,您可以了解这一点。使用“显示表​​状态”来比较数据长度。

2)全文搜索 - 仅在MyISAM数据

3)GIS /空间数据类型 - 只在MyISAM数据

性能,因为其他的答案和参考答案表明,它取决于你的工作量。 MyISAM的全表扫描速度要快得多。 InnoDB对于高度并发访问往往要快得多。如果您的查询基于主键,InnoDB也可以更快。

另一个性能问题是MyISAM总是可以保持行计数,因为它只进行表级锁定。因此,如果您经常尝试获取非常大的表的行数,那么InnoDB可能会慢很多。搜索互联网,如果你需要解决这个问题,我已经看到了几个提议。

根据表的大小,您可能还需要更新您的MySQL配置文件。至少,您可能希望将字节从key_buffer转移到innodb_buffer_pool_size。如果您将数据库保留为针对MyISAM进行优化,则不会得到公平的比较结果。阅读所有innodb_ *配置属性。

0

根据我的经验,MyISAM表格仅适用于需要在大文本上进行搜索时具有良好性能的文本索引,但您仍然不需要像Solr或ElasticSearch这样的完全成熟的搜索引擎。

如果你想切换到InnoDB的,但要保持索引的MyISAM表你的文字,我建议你先在这看看:http://blog.lavoie.sl/2013/05/converting-myisam-to-innodb-keeping-fulltext.html

另外:InnoDB支持使用innobackupex来自Percona的活原子备份。在处理生产服务器时,这是上帝。