MySQL有效地将所有记录从一个表复制到另一个表

crm*_*cco 20 mysql sql insert mysql5

是否有一种更有效,更省力的方法将所有记录从一个表复制到另一个表:

INSERT INTO product_backup SELECT * FROM product
Run Code Online (Sandbox Code Playgroud)

通常,该product表将保存大约50,000条记录.两个表的结构相同,其中有31列.我想指出这不是我的数据库设计,我继承了遗留系统.

Mar*_*ams 19

你错过了一件事.特别是,如果您正在使用InnoDB,是否要在SELECT语句中显式添加ORDER BY子句,以确保以主键(聚簇索引)顺序插入行:

INSERT INTO product_backup SELECT * FROM product ORDER BY product_id
Run Code Online (Sandbox Code Playgroud)

如果不需要,请考虑删除备份表上的二级索引.这也将节省服务器上的一些负载.

最后,如果您使用的是InnoDB,请减少所需的行锁数,并只显式锁定两个表:

LOCK TABLES product_backup WRITE;
LOCK TABLES product READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

锁定的东西可能不会产生很大的不同,因为行锁定速度非常快(虽然不如表锁定快),但是因为你问过.


Rom*_*ain 12

我认为这是将记录从一个表复制到另一个表的最佳方法.这样,您也可以保留目标表的现有索引.


sat*_*v86 5

mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql
Run Code Online (Sandbox Code Playgroud)

这将转储指定的表,并在导入时使用删除选项删除现有表。然后做,

mysql db_name < filepath/file_name.sql
Run Code Online (Sandbox Code Playgroud)


mih*_*imi 1

我认为这对于 50k 表来说不值得,但是:如果您有数据库转储,您可以从中重新加载表。当您想要加载另一个表中的表时,您可以使用 sed 命令更改转储中的表名称:这里有一些提示: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring- a-single-table-from-a-huge-mysqldump-file.html

另一种选择(取决于您的设计)是在原始表插入上使用触发器,以便复制的表也获取数据。

更好的替代方案是创建另一个 MySQL 实例,并以主从配置或每日转储主/加载从方式运行它。