主にMyISAMテーブルがある場合は、一括挿入バッファーを増やす必要があります。bulk_insert_buffer_sizeの設定に関するMySQLドキュメントの内容は次のとおりです。
MyISAMは、特別なツリーのようなキャッシュを使用して、空でないデータを追加するときに、INSERT ... SELECT、INSERT ... VALUES(...)、(...)、...、およびLOAD DATA INFILEの一括挿入を高速化しますテーブル。この変数は、スレッドごとのキャッシュツリーのサイズをバイト単位で制限します。0に設定すると、この最適化が無効になります。デフォルト値は8MBです。
あなたがする必要がある2つのことがあります
1)/etc/my.cnfに追加します
[mysqld]
bulk_insert_buffer_size=512M
2)グローバル値を設定します
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
bulk_insert_buffer_sizeをグローバルに設定する権限がない場合は、これを実行します
service mysql restart
もちろん、これはInnoDB用ではありません。
別の角度から、テーブルがInnoDBかMyISAMかに関係なく、インデックスがテーブルよりも大きい場合、インデックスが多すぎる可能性があります。私は通常、MyISAM mysqldumpのリロードには、mysqldumpの作成にかかった時間の3倍の時間がかかると推測しています。また、InnoDB mysqldumpのリロードには、mysqldumpの作成にかかった時間の4倍の時間がかかると推測しています。
mysqldumpのリロードで4:1の比率を超えている場合、間違いなく2つの問題のいずれかがあります。
- インデックスが多すぎる
- 大きい列のためにインデックスが大きすぎます
これにより、ストレージエンジンごとにデータのサイズを測定できます。
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
インデックスがデータと同じくらい大きいか、さらに大きいかを確認します
また、次のようにバイナリロギングを無効にすることも検討できます。
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
スクリプトをリロードする前に