20

これを行う、あるテーブルから別のテーブルにすべてのレコードをコピーする、より効率的で手間のかからない方法はありますか?

INSERT INTO product_backup SELECT * FROM product

通常、productテーブルには約 50,000 レコードが保持されます。両方のテーブルの構造は同じで、31 列あります。これは私のデータベース設計ではなく、レガシー システムを継承していることを指摘したいと思います。

4

4 に答える 4

19

あなたに欠けているものはただひとつ。特に、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;

行のロックは非常に高速であるため (テーブルのロックほど高速ではありませんが)、おそらく大きな違いはありませんが、あなたが尋ねたからです。

于 2012-06-25T13:06:41.570 に答える
5
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql

これは、インポート時に既存のテーブルを削除するドロップ オプションを使用して、指定されたテーブルのダンプを取得します。その後、

mysql db_name < filepath/file_name.sql
于 2012-06-25T11:49:07.873 に答える
2

DROP宛先テーブル:

DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
于 2014-08-15T08:08:47.030 に答える