私はSQLダンプを持っていて、それはかなり大きい(411 MB)であり、サーバーAにインポートするのに10分かかりました。 )したがって、これは53倍遅くなります。
スペック:
Server A:
MySQL Version: 5.5.30-1.1 (Debian)
2 GB RAM
1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020
Workstation B:
MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
14 GB RAM
4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000
Mysql/maria構成は、ストック構成です。
私は昨日、自分のワークステーションでMariaDBに切り替えました-しかし、MariaDBの前には、統計はさらに悪かったです。
ワークステーション上のすべてのデータベースをすでに削除しました-違いはありません。
大きな問題は次のとおりです:パフォーマンスを53倍遅くするにはどうすればよいですか?私はこのように作業できません:-(
私のインポートコマンド:
pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'
iostat -xm 5
サーバーA:
avg-cpu: %user %Nice %system %iowait %steal %idle
17,43 0,00 30,28 51,85 0,00 0,44
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0,00 254,03 0,00 1305,45 0,00 6,09 9,56 0,78 0,60 0,00 0,60 0,57 74,25
ワークステーションB:
avg-cpu: %user %Nice %system %iowait %steal %idle
7,32 0,00 3,22 5,03 0,00 84,42
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0,00 1,40 0,80 172,40 0,00 0,56 6,72 1,17 6,75 12,00 6,72 5,40 93,52
dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc
サーバーA:
1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s
ワークステーションB:
1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
この答えはすべてを大幅にスピードアップしました:
https://stackoverflow.com/a/2167641/292408
私は単に
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
初めに、そして
COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;
最後に。
今では3分かかりました。
(@andreasemerのTwitterによる提供)
上記の補足説明...ダンプファイルは既に次のような方法で自動的に生成されています。
mysqldump my_db > db-dump-file.sql
このインポートを自動化したいので、コンピューターにdefault-start-import.sql
およびdefault-end-import.sql
という2つのファイルを作成しました。その内容はdefault-start-import.sqlです。
SET autocommit=0;
およびdefault-end-import.sql:
COMMIT;
SET autocommit=1;
実行するスクリプトは次のようなものです。
cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db
同じコマンドだが読みやすい:
cat default-start-import.sql \
db-dump-file.sql \
default-end-import.sql \
| mysql my_other_db
この場合、cat
は、それらのファイルをパイプに送信する前に連結するために使用されます。 cat
コマンドがファイル間の行をマージしないように、すべてのファイルが改行文字(テキストエディターから見た場合はファイルの最後の空行)で終わることが重要だと思います。
インポートは正常に機能します。有効化と無効化の自動コミット機能が改善されたため、実際に高速であるかどうかはテストしていませんが、それにより高速になる場合は、この追加の手順により簡単になります。
私は_--compress
_と_SET autocommit=0;
_を試してみましたが、少しは役に立ちました...
複数の_INSERT INTO ...
_ステートメントを複数のVALUES(...), (...)
を含む1つの大きなステートメントに変換すると、速度が大幅に向上することがわかりました。
WAN経由のSSL経由でmysql
を使用しています。リモートMySQLデータベースはAmazonでホストされています。
9列、2,100行:
INSERT
ステートメント:82秒INSERT
ステートメント:<1秒7列と42,000行の場合:
INSERT
ステートメント:1,740秒INSERT
ステートメント:105秒したがって、データベースダンプを生成するツール(より具体的にはINSERT
ステートメントの形式)に応じて、速度が影響を受ける可能性があります。
注:これにより、テストでは_.sql
_ダンプファイルも60%以上減少するため、I/Oも節約されます。
警告:mysql
を使用したこの手法には物理的な制限があります および移植性が必要な場合... SQLサーバー 一度に1,000行のみに制限されているようです 。
それでも、42,000行に対して一度に1,000行を実行すると、1,657%の改善が得られます。