20

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

INSERT INTO product_backup SELECT * FROM product

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

4

4 回答 4

19

你只缺少一件事。特别是,如果您使用的是 InnoDB,是否要在 SELECT 语句中显式添加 ORDER BY 子句以确保您以主键(聚集索引)顺序插入行:

INSERT INTO product_backup SELECT * FROM product ORDER BY product_id

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

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

LOCK TABLES product_backup WRITE;
LOCK TABLES product READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;

锁定的东西可能不会有很大的不同,因为行锁定非常快(虽然不如表锁快),但是既然你问了。

于 2012-06-25T13:06:41.570 回答
5
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql

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

mysql db_name < filepath/file_name.sql
于 2012-06-25T11:49:07.873 回答
2

DROP目标表:

DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
于 2014-08-15T08:08:47.030 回答
1

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

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

一个更好的选择是创建另一个 MySQL 实例并以主从配置或每日转储主/负载从属方式运行它。

于 2012-06-25T11:32:16.167 回答