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

时间:2012-06-25 11:23:52

标签: mysql sql insert mysql5

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

INSERT INTO product_backup SELECT * FROM product

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

5 个答案:

答案 0 :(得分:16)

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

INSERT INTO product_backup SELECT * FROM product ORDER BY product_id

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

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

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:4)

mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql

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

mysql db_name < filepath/file_name.sql

答案 3 :(得分:2)

DROP目的地表:

DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);

答案 4 :(得分:1)

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

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

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