将MyISAM转换为InnoDB。有益吗?后果如何?

8
我们正在运营一个社交网络网站,记录每个成员的所有操作(包括访问其他成员的页面);这涉及对数据库进行大量写入。这些操作存储在一个MyISAM表中,由于某些原因开始占用CPU资源,我的第一个想法是MyISAM表锁定导致了CPU负载过高。
  • 这个表只有读和写,没有更新。我认为读写之间的平衡在这个表上是50/50,那么InnoDB是否是更好的选择?
  • 如果我想将表更改为InnoDB,并且我们不使用外键约束、事务或全文索引-我需要担心什么吗?

https://dev59.com/73VD5IYBdhLWcg3wU52G - Bozho
这不是与上面重复的内容,因为它涉及迁移而非本身的好处。 - MarkR
你也可以使用混合表,将MyISAM用于读取频繁的表格,而将InnoDB用于日志。然而,我个人今天不会在任何地方大量使用MyISAM(只有全文搜索才会使用)。 - bobince
4个回答

8

尽管其使用的优缺点在其他主题中已经讨论过(MyISAM与InnoDB),但迁移是一个非常复杂的过程。

请考虑:

  • 尽可能对所有与数据库交互的组件进行功能测试 - 不同的引擎具有不同的语义
  • 尽可能运行性能测试 - 有些东西可能会改善,而其他东西可能会更糟。一个众所周知的例子是在大型表上执行SELECT COUNT(*)。
  • 检查所有代码是否能够优雅地处理死锁 - 您可以在没有显式使用事务的情况下遇到死锁
  • 估计转换后您将获得多少空间使用量 - 在非生产环境中进行测试。

您无疑需要更改大型软件平台中的一些内容;这是可以接受的,但是由于您(希望)拥有很多自动化测试覆盖率,因此应该接受变化。

附言:如果“某些内容开始占用CPU”,则应该 a)在非生产环境中找出原因,b)尝试各种减少它的选项,在非生产环境中进行。当您没有完全分析问题时,不应盲目开始执行重大操作,例如更改数据库引擎。

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


1
非常感谢您提供这些信息。您能详细说明一下“不同的语义”是什么意思吗? - stef

4
关于其他可能的迁移问题:
1)空间 - InnoDB表通常需要更多的磁盘空间,但新版本InnoDB的Barracuda文件格式缩小了差距。您可以通过转换最近备份的表并比较大小来了解这一点。使用“show table status”比较数据长度。
2)全文搜索 - 仅限于MyISAM
3)GIS /空间数据类型 - 仅限于MyISAM
关于性能,正如其他答案和参考答案所指出的那样,它取决于您的工作负载。 MyISAM对于全表扫描要快得多。 InnoDB倾向于在高度并发访问时更快。如果您的查找基于主键,则InnoDB也可以更快。
另一个性能问题是,由于它仅进行表级锁定,因此MyISAM始终可以保持行计数。因此,如果您经常尝试获取非常大的表的行计数,则使用InnoDB可能会慢得多。如果需要解决此问题,请在互联网上搜索,因为我已经看到了几个提议。
根据表的大小,您还可能需要更新MySQL配置文件。至少,您可能希望将字节从key_buffer移动到innodb_buffer_pool_size。如果您将数据库作为针对MyISAM进行优化的状态,则不会得到公平的比较。阅读所有innodb_*配置属性的相关信息。

2

我认为转换到InnoDB可能会提高性能,但根据我的经验,除非亲自试一试,否则无法确定。如果我是你,我会在同一服务器上设置一个测试环境,转换成InnoDB并运行基准测试。


0

根据我的经验,MyISAM表只适用于需要在大文本上进行搜索时需要良好性能的文本索引,但仍不需要像Solr或ElasticSearch这样完整的搜索引擎。

如果您想切换到InnoDB但仍想在MyISAM表中保留文本索引,请参阅此链接:http://blog.lavoie.sl/2013/05/converting-myisam-to-innodb-keeping-fulltext.html

另外:InnoDB支持使用Percona的innobackupex进行实时原子备份,在处理生产服务器时非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接