两步就够了吗?
(1) 对information_schema 运行SELECT,如其中一些链接所示。但是让它输出 100 个完整的ALTER 语句。
SELECT CONCAT("ALTER TABLE ", table_name, " ENGINE=InnoDB;
")
FROM information_schema.tables
WHERE engine='MyISAM'
AND table_schema='MyDatabase'
AND ...;
(2) 将这100行复制粘贴到phpadmin中。去喝杯咖啡。或者花时间阅读有关gotchas in converting 的信息,看看您是否会遇到一些问题。
真正并行执行它们不太可能更快——您将受到 I/O 限制。而且小桌会很快完成,让大桌延长时间。
输出样本:
SELECT CONCAT("ALTER TABLE ", table_name, " ENGINE=InnoDB;
")
FROM information_schema.tables
WHERE engine='MyISAM'
AND table_schema='test';
产生类似的东西:
ALTER TABLE 07 ENGINE=InnoDB;\n
ALTER TABLE 597377b ENGINE=InnoDB;\n
ALTER TABLE adjprice ENGINE=InnoDB;\n
ALTER TABLE big ENGINE=InnoDB;\n
ALTER TABLE bigv ENGINE=InnoDB;\n
ALTER TABLE blobid ENGINE=InnoDB;\n
ALTER TABLE charlatin1 ENGINE=InnoDB;\n
ALTER TABLE collorder ENGINE=InnoDB;\n
ALTER TABLE collorder2 ENGINE=InnoDB;\n
ALTER TABLE countries ENGINE=InnoDB;\n
ALTER TABLE d1 ENGINE=InnoDB;\n
然后将生成的许多行粘贴回工具中。无需手动输入名称。
如果您首先转换 100 个表,当您再次运行查询时,它们将不会被包含在内。仅包含新的 25 个。
不,您不能“自动”将任何新表更改为不同的引擎。不过……
通过在my.cnf 中这样说,您可以将所有未明确指定ENGINE 的新表设为InnoDB:
[mysqld]
default_storage_engine = InnoDB