是否有更高效,更省力的方式将所有记录从一个表复制到另一个表:
INSERT INTO product_backup SELECT * FROM product
通常,product
表将保留大约50,000条记录。两个表的结构相同,其中有31列。我想指出这是不我的数据库设计,我继承了遗留系统。
答案 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实例,并以主从配置或每日转储主/负载从属方式运行它。