MySQL创建表与引擎覆盖一样

时间:2012-01-09 12:46:24

标签: mysql wordpress innodb myisam multiple-databases

我正在使用wpmudev.org的插件将一个包含一个数据库和81,000多个表的wordpress站点分解为多个数据库。主要的动力是表现,我自己检查表格,它们是MyISAM类型。

我在想,在将表格移动到新数据库的过程中,我还可以将表格类型更改为InnoDB,这样可以提高网站性能。

将表从现有数据库迁移到新数据库的脚本使用以下语法:

CREATE TABLE .... LIKE .... INSERT INTO .... SELECT * FROM ....

如果我可以在CREATE TABLE命令中对引擎进行过度操作,我无法找到信息,例如:

CREATE TABLE .... LIKE .... ENGINE = InnoDB

另外我想知道“INSERT INTO .... SELECT * FROM ....”是否是插入数据的最有效方式...这是一个php脚本所以我不介意添加一些代码提高性能 - 在较早的试验中花费3天时间在4核4GB RAM上运行!

4 个答案:

答案 0 :(得分:2)

是的,我这样做了(覆盖表格类型)。工作正常。

对于像这样的大型转移,我通常会做某种形式的数据库转储, 用于按摩数据的脚本(例如,更改引擎类型),然后还原到新数据库。基于文本的数据库转储大多使用COPY,这比INSERT INTO快。

您也可以发出ALTER TABLE {} ENGINE=INNODB;。虽然这说明一个新的开始还有很多事情要做。

81,000张桌子。哇。

答案 1 :(得分:2)

这个问题也被另一个问题间接回答,这个问题帮助了我,因为我试图将表克隆到MEMORY引擎中: how-to-copy-mysql-table-structure-to-table-in-memory

CREATE TABLE % ENGINE=InnoDB SELECT * FROM %

希望这有助于帮助我的人!

答案 2 :(得分:0)

您无法使用create table like...语法指定ENGINE参数,但以下是一些替代方法:

CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original`

...将复制表结构和数据,无需键和分支

CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original` WHERE 0

...将只复制结构,但没有数据(因为WHERE 0将全部过滤掉)

CREATE TEMPORARY TABLE `another_table` ) ENGINE=MEMORY SELECT * FROM `original`

...也许,您想添加TEMPORARY字,然后当您关闭连接时,DB会自动删除该表

CREATE TABLE `another_table` ( INDEX(`id_column`) ) ENGINE=MEMORY SELECT * FROM `original`

...这是关于如何在新表中重新创建键的示例(定义键的语法与简单的CREATE TABLE语法中的相同)

答案 3 :(得分:0)

或者只是:

 CREATE TABLE `another_table` ENGINE=MEMORY SELECT * FROM `original` LIMIT 0