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

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

INSERT INTO product_backup SELECT * FROM product

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

5 ответов

Решение

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

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

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

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

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 и запуск его в конфигурации "ведущий-ведомый" или в режиме "ведущий / загрузочный ведомый" для дампов.

Другие вопросы по тегам