我们正在运行一个社交网站,记录每个成员的行为(包括访问其他成员的网页);这涉及到很多写入数据库。这些操作存储在MyISAM表中,并且由于开始对CPU征税,我首先想到的是MyISAM的表锁定导致了CPU的压力。将MyISAM转换为InnoDB。有利?后果是什么?
- 只有读取和写入,没有对此表的更新。我认为读取和写入之间的平衡大约是50/50,因此InnoDB会是更好的选择吗?
- 如果我想将表更改为InnoDB,并且我们不使用外键约束,事务或全文索引 - 我需要担心什么吗?
我们正在运行一个社交网站,记录每个成员的行为(包括访问其他成员的网页);这涉及到很多写入数据库。这些操作存储在MyISAM表中,并且由于开始对CPU征税,我首先想到的是MyISAM的表锁定导致了CPU的压力。将MyISAM转换为InnoDB。有利?后果是什么?
尽管在其他线程(MyISAM versus InnoDB)中讨论过使用它的任何优点/缺点,但迁移是一个不平凡的过程。
考虑
您将无疑需要在大型软件平台上进行更改;这是可以的,但看到你(希望)有很多自动测试覆盖,改变应该是可以接受的。 PS:如果“某物开始对CPU征税”,那么你应该a)在非生产环境中找出什么,b)在非生产环境中尝试各种减少它的选项。当你没有完全分析问题时,你不应该盲目地开始做重大事情,比如更改数据库引擎。
所有的性能测试都应该在非生产环境中进行,具有类似生产的数据和生产级硬件。否则,很难正确解释结果。
非常感谢这个信息。你能否详细说明“不同的语义”? – stef 2010-01-05 14:12:14
我认为很有可能切换到InnoDB会提高性能,但根据我的经验,在尝试之前无法确定。如果我是你,我会在同一台服务器上建立一个测试环境,转换成InnoDB并运行基准测试。
至于其他潜在的迁移问题:
1)空间 - InnoDB表往往需要更多的磁盘空间,但对于InnoDB的新版本梭子鱼的文件格式已经缩小差别。通过转换表格的最近备份并比较大小,您可以了解这一点。使用“显示表状态”来比较数据长度。
2)全文搜索 - 仅在MyISAM数据
3)GIS /空间数据类型 - 只在MyISAM数据
性能,因为其他的答案和参考答案表明,它取决于你的工作量。 MyISAM的全表扫描速度要快得多。 InnoDB对于高度并发访问往往要快得多。如果您的查询基于主键,InnoDB也可以更快。
另一个性能问题是MyISAM总是可以保持行计数,因为它只进行表级锁定。因此,如果您经常尝试获取非常大的表的行数,那么InnoDB可能会慢很多。搜索互联网,如果你需要解决这个问题,我已经看到了几个提议。
根据表的大小,您可能还需要更新您的MySQL配置文件。至少,您可能希望将字节从key_buffer转移到innodb_buffer_pool_size。如果您将数据库保留为针对MyISAM进行优化,则不会得到公平的比较结果。阅读所有innodb_ *配置属性。
根据我的经验,MyISAM表格仅适用于需要在大文本上进行搜索时具有良好性能的文本索引,但您仍然不需要像Solr或ElasticSearch这样的完全成熟的搜索引擎。
如果你想切换到InnoDB的,但要保持索引的MyISAM表你的文字,我建议你先在这看看:http://blog.lavoie.sl/2013/05/converting-myisam-to-innodb-keeping-fulltext.html
另外:InnoDB支持使用innobackupex来自Percona的活原子备份。在处理生产服务器时,这是上帝。
http://stackoverflow.com/questions/20148/myisam-versus-innodb – Bozho 2010-01-05 13:01:13
这不是上述的重复,因为它涉及迁移而不是本身的好处。 – MarkR 2010-01-05 13:33:20
您还可以使用混合表格,使MyISAM保留用于读取繁重的表格和InnoDB的日志。不过,我个人今天不会使用MyISAM(真的只有全文searchbait)。 – bobince 2010-01-05 13:56:44