我正在使用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上运行!
答案 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