innodb表和分区会提高mysql的性能吗?



我有一个Myisam表,有2列和9000万数据的复合唯一键。现在我们面临着内存和负载问题,在浏览了web之后,我计划包括分区并将此表更改为Innodb以获得更好的性能。但我有以下顾虑:

  1. 切换到innodb会有很长的停机时间,是否有可能最小化停机时间?

  2. 大多数选择查询都是在我计划对其进行哈希分区的键的特定列上,它对另一个键列的查询有多大影响?

这些改变会像理论上提到的那样提高性能吗?对于这种情况有没有更好的解决办法?任何建议或经验都会有所帮助。

我的查询很简单,如

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,您必须发布一个模式以及您的分区策略和您担心的查询。

最新更新