これを行う、あるテーブルから別のテーブルにすべてのレコードをコピーする、より効率的で手間のかからない方法はありますか?
INSERT INTO product_backup SELECT * FROM product
通常、product
テーブルには約 50,000 レコードが保持されます。両方のテーブルの構造は同じで、31 列あります。これは私のデータベース設計ではなく、レガシー システムを継承していることを指摘したいと思います。
あなたに欠けているものはただひとつ。特に、InnoDB を使用している場合、SELECT ステートメントに ORDER BY 句を明示的に追加して、主キー (クラスター化インデックス) の順序で行を挿入するようにします。
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
これは、インポート時に既存のテーブルを削除するドロップ オプションを使用して、指定されたテーブルのダンプを取得します。その後、
mysql db_name < filepath/file_name.sql
DROP
宛先テーブル:
DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);