我有一个Myisam表,有2列和9000万数据的复合唯一键。现在我们面临着内存和负载问题,在浏览了web之后,我计划包括分区并将此表更改为Innodb以获得更好的性能。但我有以下顾虑:
-
切换到innodb会有很长的停机时间,是否有可能最小化停机时间?
-
大多数选择查询都是在我计划对其进行哈希分区的键的特定列上,它对另一个键列的查询有多大影响?
这些改变会像理论上提到的那样提高性能吗?对于这种情况有没有更好的解决办法?任何建议或经验都会有所帮助。
我的查询很简单,如
Select * from Table where Col1= "Value"
Select * from Table where Col1="Value" and Col2 IN (V1,V2,V3)
InnoDB将可能帮助一些。转换到InnoDB有一些问题,正如我在我的转换博客中所说的。
分区本身不会获得性能增益。我的分区博客列出了4种情况,您可以通过更改设计来获得性能。
无论引擎如何,您的两个查询都将受益于
INDEX(col1, col2)
任何形式的分区都不会有帮助。HASH
分区尤其无用
转换到InnoDB将花费大量的停机时间,除非pt-online-schema-change
将为您的情况工作。研究它。
也可以阅读我的回答和评论我可以设置Mysql为自动分区吗?查看更多细节。
添加索引可能是主要的性能增益。但是你必须做一个冗长的ALTER
才能得到它。MyISAM没有ALGORITHM=INPLACE
.
Innodb(我们现在谈论的性能)只有在有大量的插入和更新到你的表时才有意义,因为行锁表。如果表上的大多数查询都是select,那么MyIsam会更快。建议:将my.cnf key_buffer_size设置为25%的空闲内存
如果您的数据库上的插入非常频繁,那么切换到innodb可能会提高性能,因为innodb不会锁定整个表来插入,允许其他客户端并发地选择数据。
关于问题#1,如果你担心宕机,我建议你找到一个并行转储/加载解决方案来迁移你的数据到innodb。如果你只是在你的表上运行ALTER语句,这是一个单线程操作,将会慢得多。
关于#2,您必须发布一个模式以及您的分区策略和您担心的查询。