MySQL эффективно копирует все записи из одной таблицы в другую

есть ли более эффективный, менее трудоемкий способ копирования всех записей из одной таблицы в другую, что делаю это:

INSERT INTO product_backup SELECT * FROM product

как правило,product таблица будет занимать около 50 000 записей. Обе таблицы идентичны по структуре и имеют 31 столбец. Я хотел бы отметить, что это не мой дизайн базы данных, я унаследовал унаследованную систему.

5 ответов


Я думаю, что это лучший способ скопировать записи из одной таблицы в другую таблицу. Таким образом, вы также сохраняете существующие индексы целевой таблицы.


есть только одна вещь, которую вы упускаете. Особенно, если вы используете InnoDB, вы хотите явно добавить предложение ORDER BY в инструкцию SELECT, чтобы убедиться, что вы вставляете строки в первичный ключ (кластеризованный индекс) order:

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;

блокировка, вероятно, не будет иметь большого значения, так как блокировка строк очень быстрая (хотя и не так быстро, как блокировки таблиц), но так как вы спросили.


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

это займет дамп указанных таблиц с опцией drop для удаления существующей таблицы при ее импорте. тогда сделай,

mysql db_name < filepath/file_name.sql

DROP целевой таблицы:

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

Я не думаю, что это будет достойно таблицы 50k, но: Если у вас есть дамп базы данных вы можете перезагрузить таблицу из него. Когда вы хотите загрузить таблицу в другую, вы можете изменить имя таблицы в дампе с помощью команды sed: Здесь у вас есть некоторые подсказки: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html

альтернативой (в зависимости от вашего дизайна) было бы использовать триггеры на исходных вставках таблицы так что дублированная таблица также получает данные.

и лучшей альтернативой было бы создать другой экземпляр MySQL и либо запустить его в конфигурации master-slave, либо в ежедневном режиме dump master/load slave.