2012-07-01 9 views
10

私はこれについて基本的に理解していると思いますが、データベースのパフォーマンスについてもっと学ぶことに興味があるので、誰かが私に詳細を教えてくれることを願っています。特定の接続で遅いMySQLクエリは、他の接続にいつ影響しますか?

私は非常に大きなデータベースを持ち、何百万ものエントリがあり、データベースは多くの接続をサポートしています。あまりにも多くのデータがあるので、データベース上で単純なクエリを実行するのは遅くなります。特定の接続のクエリが他の接続で実行されているクエリのパフォーマンスに直接影響を与える時期を正確に理解しようとしています。

1つの接続でいくつかの要素がロックされると、それらの要素を必要とする他の接続を実行するクエリが保持されることがわかります。たとえば、次のようにします。

SELECT FOR UPDATE 

あなたが選択しているものがロックされます。

SELECT COUNT(*) FROM myTable 

は、私たちが、カウントを実行している十億行はいくつかの時間(InnoDBの上で実行されている)を取るために起こっているとテーブルを持って言うことができます:あなたはのような単純な何かをするとどうなり

。他の接続で実行されているクエリに影響しますか?他のクエリのロックは何も参加したん

SELECT * FROM myTable1 JOIN myTable2 ON myTable1.id = myTable2.id; 

:何SELECT使用して大量のデータを選択し、同様に、JOINの場合

他の接続で実行されているクエリのパフォーマンスにどのようなクエリが直接影響を与えるかはわかりません。

おかげ

答えて

4

は異なる角度があります。

  • 行ロックは:あなたはそれ
  • リアルタイムパフォーマンスの問題やボトルネックを忘れる必要がありますので、ごチューニングアーキテクチャならば、これは発生しません。我々の場合、担保効果。この第二の点について

、問題は、主に3つの領域に分割されている:

  • ディスクは
  • メモリ使用量(バッファ)
  • CPU使用率を読み出します。

ディスクの読み取りについて:取得するデータ(バイト)が多いほど、ハードドライブがビジー状態になり、それを使用する他のアクティビティが減速します。ディスクのオーバーヘッドを避けるために、選択した行のサイズを小さくします。

メモリの使用について:mysqlは内部バッファを管理しますが、状況によってはスタックすることがあります。私はあなたに適切な答えを与えるためにそれについて十分に知っていませんが、これは確かにあなたが目を離さなければならない何かを知っています。 CPU使用率について

:それ

  • が計算したとき、基本的には、CPUが忙しくなります(、書類の作成、参加する算術演算を...)
  • は、すべての末梢ものを行うためにありますからバイトを移動します例えば、ディスクからメモリへ。 クエリを最適化してCPUのオーバーヘッドを削減します。 (愚かな音だが、とにかくいつも問題になることが常に...)

これで、いつ担保効果があるのか​​を知るときはいつですか?あなたのハードウェアをプロファイリングすることによって... どのようにプロフィール?

  • 絶対プロファイリング:メインのMySQLのハードドライブ、CPUとメモリの時計に関する有用な情報を得るためにSHOW INNODB STATUSまたはSHOW PROFILEを使用しています。
  • 相対プロファイリング:お好みのOSプロファイラを使用してください。例えばwindows xpの場合は、perfmon.exeを使って、mysqlプロセスのPRIVATE BYTESVIRTUAL BYTESを見ることができます。私は相対的です。あなたのコンピュータでクエリに時間がかかる場合は、NASAシステム上にない可能性がありますので、後で言います。

ご協力いただきたいと思います。

+0

ありがとう、それは物事のハードウェアの側面をはるかに明確に理解する。しかし、最初の角度からは、特定のクエリがロックを引き起こすかどうかを確信できるかどうかを正しく理解していません。 – sungiant

+0

更新も削除もしない場合、ロックはありません(CASCADEまたはTRIGGERS副作用)トランザクション内の指定された行、または明示的な設定はLOCK mysqlコマンドを使用して自分自身をロックします。単純なSELECTは決して行をロックしません。また、私が覚えている限り、テーブル全体を非常に簡単にロックするMYISAMエンジンの世話をしてください! – Sebas

+0

はい、MyISAMは更新/削除時にテーブルレベルのロックを行います。 InnoDBロックは、where句が一意または主キーを使用する場合は行レベルのロックを行い、それ以外の場合はブロックレベルのロックまたはテーブルロックを行います。 –

3

読むクエリのみを他のクエリの分離レベルの影響を受けています。彼ら自身は表をブロックしません。

分離レベルはトランザクション安全モードと指定されています。 別のロックを使用しているクエリでは、のダーティリードは許可されません。他のクエリの書き込みまたはロック解除が完了するまで読み取りが保持されます。

MVCCは、更新または削除が必要なときにデータベースで新しいバージョンのデータを作成できるようにするメカニズムです。つまり、現在のバージョンのデータで読み込みを開始すると、そのデータは将来の更新/削除によって汚染されることはありません。

現在、別のプロセスによってデータが読み込まれているにもかかわらず、現在のデータに対する書き込みを開始すると、実際に新しいものを別の場所に書き込んで最新バージョンとしてマークしています。最終的には、書き込みプロセスのブロックを意味しません(少なくとも読み取りプロセスのためではない)。

+0

ありがとう、それは多くの意味がありますが、どのように与えられたクエリが読まれているかを知ることができます。上に示したような、たくさんの作業が必要な結合を持つ読取り問合せを持つ場合、接続Aで開始し、接続Bの別の問合せが、Aが現在選択しようとしているデータの行を更新した場合。何が起こるのですか? BはAを待つか? Bは変更を加えたので、Aは停止して再開する必要がありますか?これ以上の情報があれば、最も役立ちます。 – sungiant

+0

私はちょうど私の答えを更新します。 –

2

これは非常に一般的な質問ですので、正確な回答をすることは難しいです。

データベースは共有リソースのプールと考えることができます。特に、データベースが実行されているハードウェアに物理的な限界があるためです。ほとんどの場合、ディスクIOやRAMアクセスやCPU時間などの基本的な物理リソースを使用して競合するため、他のクエリにパフォーマンスの影響を与える選択クエリのようなものがある。

実際の結果は、データベースの物理ハードウェアと構成設定に大きく依存しています。

例えば、選択した例では、変数は次のようになります。クエリがRAMに既に必要なデータはありますか?インデックスで行を効率的に検索できますか? IOを実行する必要がある場合、ディスクからデータを読み込むよう求めているクエリはいくつありますか?セカンダリインデックスを使用していて、複数の読み込みが必要ですか?データベースは他のページをバッファリングするために先読みしていますか?クエリがシーケンシャルかランダムかを判断していますか?データのロックを保持する更新はありますか?物理ハードウェアがIOをどれくらい読み込めるか

他のクエリのパフォーマンスに影響を与えるかどうかを知るために、現在実行されているすべてのクエリについて、すべての質問に回答する必要があります。

これは、DBAが存在する理由です。ビジー状態のデータベースは複雑なシステムであり、非常に多くの異なる操作の相互作用に関するものであり、そのすべてには何千もの変数が影響します。

あなたが一般的にやっていることは、実際に何が起こっているのかを理解するために実行中のシステムの測定を開始する方法だけでなく、ハードウェア、mysql設定、スキーマ、およびインデックスを知ることです。

あなたのケースでは、クエリを個別に最適化することに集中することは無限に役立つと私は言います。実行速度は速く、使用しているリソースが少なく、変更が少なくても他のリソースに影響を与えます。次に、システムを分析する方法を学びます。遅いものを見て、「なぜこれが遅いの?」と尋ねる。その後、それを修正します。それが最適化プロセスです。

しかし、最初のケースではSELECT ... FOR UPDATEで書いています。明示的なロックは可能で、パフォーマンス上の大きな問題になります。それらには注意してください。

+0

答えをありがとう、SQLクエリがブロッキングの問題を引き起こすかどうかを知る方法に関するアドバイスをくれますか? SELECT ... FOR UPDATEが問題を起こすことをどうやって瞬時に知りましたか?他にどのようなSQLコマンドが同様の問題を引き起こしますか? – sungiant

+0

SELECT FOR UPDATEはInnoDBの行をロックしたり、MyISAMのテーブルをロックしたりします。トランザクションで使用され、処理して最終的に更新するデータを取得します。またwhere句に合わない行をロックするかもしれませんが、なぜロックされたのか(私がこれを読んだとき)なぜか分かりませんでしたが、where節で部分候補になっていて解放されていません。 –

関連する問題