Ответ 1
Я думаю, что это лучший способ скопировать записи из одной таблицы в другую. Таким образом, вы также сохраняете существующие индексы целевой таблицы.
Существует ли более эффективный и менее трудоемкий способ копирования всех записей из одной таблицы в другую, которая делает это:
INSERT INTO product_backup SELECT * FROM product
Обычно таблица product
содержит около 50 000 записей. Обе таблицы идентичны по структуре и содержат 31 столбцов. Я хотел бы указать, что это не мой проект базы данных, я унаследовал устаревшую систему.
Я думаю, что это лучший способ скопировать записи из одной таблицы в другую. Таким образом, вы также сохраняете существующие индексы целевой таблицы.
Там только одна вещь, которую вы упускаете. Особенно, если вы используете InnoDB, хотите ли вы явно добавить предложение ORDER BY в свой оператор SELECT, чтобы гарантировать, что вы вставляете строки в порядке первичного ключа (кластеризованного индекса):
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;
Блокировка, вероятно, не будет иметь большого значения, так как блокировка строк очень быстрая (хотя и не такая быстрая, как блокировки таблиц), но, как вы и просили.
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql
Это приведет к дампу указанных таблиц с опцией drop, чтобы удалить существующую таблицу при ее импортировании. то do,
mysql db_name < filepath/file_name.sql
DROP
таблица назначения:
DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
Я не думаю, что это будет достойно для таблицы 50 000, но: Если у вас есть дамп базы данных, вы можете перезагрузить из него таблицу. Поскольку вы хотите загрузить таблицу в другую, вы можете изменить имя таблицы в дампе командой sed: Здесь у вас есть несколько советов: http://blog.tsheets.com/2008/tips-tricks/mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html
Альтернативой (в зависимости от вашего дизайна) будет использование триггеров в исходных табличных вставках, чтобы дублированная таблица также получала данные.
И лучшей альтернативой могло бы стать создание другого экземпляра MySQL и запуск его в конфигурации ведущий-ведомый или в режиме ежедневного запуска/загрузки.