我有一个 mysql 5.1 服务器,它的数据库大约有 450 个表,占用 4GB 。这些表中的绝大多数(除了 2 个)都是 MyIsam。这在大多数情况下都很好(不需要事务),但是应用程序一直在获得流量,并且某些表由于更新时的表锁定而受到影响。这就是现在有 2 个表是 InnoDB 的原因。
较小表(100k 行)上的转换根本不需要很长时间,导致停机时间最短。然而,我的一些跟踪表接近 5000 万行。有没有办法加快ALTER TABLE...ENGINE InnoDB
大桌子的速度?如果没有,是否还有其他方法可以将这些写入繁重的表的停机时间最小化?
首先让我说,我讨厌 ALTER。这是邪恶的,恕我直言。
说,这是您当前的表架构 -
这是我推荐的路径 -
创建一个将替换旧表对象的新表对象:
按名称将旧表中的所有行插入到新表中:
冒烟测试您的迁移:
交换表名,以便在需要回滚时维护备份。
进行回归测试。
对于具有多个索引和数百万行的表,这种方法变得越来越可取。
想法?
1) 损失保护是偏执狂的功能。始终进行备份。如果您真的很偏执,请进行备份,然后从备份中恢复。
2)MySQL手册的这个页面有转换表类型的说明。
3) PostgreSQL 做全文搜索,Sphinx引擎似乎是为 MySQL 做的
当您只使用一个引擎时,优化整个服务器(内存配置、缓存、索引)要容易 X 倍。在大型数据库上混合 myisam 和 innodb 总是会卡在某个点,因为这两个引擎都需要妥协才能正常工作(但不是很好:)
我建议您对一些专用的全文搜索引擎感兴趣,如sphinx、 lucene ( solr ) 并从数据库层摆脱它。