我有一个Myisam表,其中包含2列和9000万数据的复合唯一键。现在我们正面临内存和负载问题,在浏览完网络后,我计划将分区和更改此表更改为Innodb以获得更好的性能。但我有以下顾虑:
更改为innodb将导致大量停机时间,是否可以最大限度地减少停机时间?
大多数select查询都在我计划进行哈希分区的键的特定列上,它会对另一个键列的查询产生多大影响?
这些变化是否会在理论上提升到性能?这种情况有没有更好的解决方案。任何建议或经验都会有所帮助。
我的查询很简单,如
Select * from Table where Col1= "Value"
Select * from Table where Col1="Value" and Col2 IN (V1,V2,V3)
插入很频繁。
答案 0 :(得分:1)
InnoDB 可能帮助一些人。转换到InnoDB会带来一些问题,正如我在My conversion blog中所述。
分区本身不会带来任何性能提升。 My partitioning blog列出了4种可以通过设计更改获得性能的案例。
无论引擎如何,您的两个查询都将 从
中受益INDEX(col1, col2)
没有任何形式的分区会有所帮助。 HASH
分区尤其无用。
转换为InnoDB将需要大量的停机时间,除非pt-online-schema-change
适用于您的情况。研究它。
另请阅读我的回答
添加该索引可能是主要的性能提升。但你必须做一个冗长的ALTER
才能得到它。 MyISAM没有ALGORITHM=INPLACE
。
答案 1 :(得分:0)
Innodb(我们现在谈论的性能)只有当你的表有很多插入和更新时才有意义,因为行锁定表。 如果您桌面上的大多数查询都是SELECT,那么MyIsam会更快。 建议:将my.cnf key_buffer_size放入等于可用内存的25%。
答案 2 :(得分:0)
如果数据库上的插入非常频繁,您可能会通过切换到innodb获得性能,而innodb不会锁定整个表以插入,允许其他客户端同时选择数据。
关于问题#1,如果您担心停机时间,我建议您找到一个并行转储/加载解决方案,用于将数据迁移到innodb。如果您只是在表上运行ALTER语句,这是一个单线程操作,速度会慢得多。
关于#2,您必须发布架构以及分区策略和您担心的查询。