7

私が取り組んでいるスクリプトは、使用国とすべての IP アドレス (またはほぼすべて) のステータスを記録するデータベース テーブルを更新するように設計されています。現在、私はそれをシンプルに保ち、5 つの RIR (Regional Internet Registries) からデータを取得して、それをデータベースに保存しています。

最初は速度は実用的ではありませんでしたが、ログ内の情報量を減らし、SQL 挿入を 1000 のグループにグループ化し、単一のクエリを使用することで、大幅に改善されました。ただし、スクリプトを実行すると、SQL 挿入の速度に非常に大きなばらつきが生じ、その理由を誰かが知っているかどうか疑問に思っていました。

以下は、私が記録した速度の一部です。テストでは、PHP でスクリプトの反復を実行するのにかかる時間と、SQL ステートメントを適用するのにかかる時間を分けました。影響が無視できるほどだったので、以下のリストに PHP の時間を含めませんでした。最大のデータ ブロックでも 1 秒以内です。

テスト速度(挿入されるデータ行の数は一貫して同じまま)

テスト 1 合計 SQL 実行時間: 33 秒

テスト 2 合計 SQL 実行時間: 72 秒

テスト 3 合計 SQL 実行時間: 78 秒

他のテストでは、約 30 秒から約 80 秒の間で変動が続きました。

2 つの質問があります。

1) これらの格差は、世の中のあり方として受け入れるべきですか、それとも理由がありますか?

2) 185000 行の挿入を 1 つのクエリにまとめることに不安を感じました。これらの挿入に 1 つのクエリを使用しないようにする理由はありますか? これほどの量のデータを一度に保存したことはありません。

ありがとうございました

__

データベーステーブルは次のとおりです。

Sorage エンジン - InnoDB

列:

id - 整数、主キー

レジストリ - varchar(7)

コード - varchar(2)

タイプ - varchar(4)

開始 - varchar(15)

値 - 整数

日付 - 日時

ステータス - varchar(10)

4

1 に答える 1

2
1) Should I accept these disparities as the way of the world, or is there a reason for them?

速度の変動は、ディスク IO を使用する競合するプロセスが原因である可能性があるため、リソースを待機しています。これが単独のテスト サーバーではなく実稼働サーバーである場合、他のプロセスがディスクへのアクセスを要求していることは確かです。

2) I felt nervous about lumping the ~185000 row inserts into one query. Is there any reason I should avoid using one query for these inserts? I've not worked with this amount of data being saved at one time before.

また、挿入を X 個の挿入のグループに分割し、各グループをトランザクションとして挿入する必要があります。

実験以外の方法で X の値を決定するのは困難です。

挿入をトランザクションにグループ化することで、各 (自動コミットされた) 挿入の後ではなく、各トランザクションの後にのみデータがディスクに書き込まれる (コミットされる) ことが保証されます。

これはディスク IO に良い影響を与えますが、多くの挿入を 1 つのトランザクションにグループ化すると、使用可能なメモリに悪影響を与える可能性があります。コミットされていないデータの量が現在のメモリに対して大きすぎる場合、DBMS は (ディスク上の) 内部ログへのデータの書き込みを開始します。

したがって、X は、挿入の数、各挿入に関連付けられたデータの量、許可されたメモリ/ユーザー/セッション パラメータに依存します。そして、他の多くのこと。


perconaからいくつかのクールな (無料の) ツールがあります。これらは、DB アクティビティを監視するのに役立ちます。

vmstat watch -n .5 'vmstat'を見ることもできます

本番環境のアクティビティによってディスクに書き込まれるデータの量と変動を確認します。

スクリプトを起動し、ディスクに書き込まれているバイト数の増加に気付くまで待ちます。ステップアップの書き込みがほぼ一定の値 (通常の本番環境での使用を超える) である場合は、スラッシング & スワッピングです。リズミカルな場合は、コミットのためだけに書き込みます。

于 2012-10-09T10:52:52.220 に答える