web-dev-qa-db-ja.com

データベースの実行を高速化するための優れた手法

MySQLデータベースを使用しているASP.Netアプリケーションがあります。私のクエリは、希望するほど速く実行されていません。より高速なPCに置くのではなく、MySQLデータベースの速度を上げる標準的な方法はありますか?.

たとえば、トランザクションSQLでプリペアドステートメントを使用する場合(これらが正しいかどうかはわかりません)。該当する場合は外部キーを使用していますか?それらの線に沿ったもの。

編集:データベースはリモートマシン上にあります

4
AngryBird

あなたがしたいことは、MySQL EXPLAINコマンド( doc )を使用してクエリをプロファイリングする方法を学ぶことです。これにより、クエリがデータベースからデータをどのように引き出しているかがわかります。行を1つずつスキャンするか、インデックスを使用するかです。これを使用すると、クエリを劇的に高速化できることがよくあります。もちろん、現在インデックスを使用していない場合は、それが最初に開始する場所です...

準備されたステートメントと準備されていないステートメントの影響...それは一般的に最小限です。コードでもプロファイルを作成する必要がありますが、これは、EXPLAINの実行から学んだことに基づいてインデックスを最適化した後でのみ行います。

10
GrandmasterB

データベースの高速化は大きなテーマです。また、データベースのクエリ、データの更新または削除で問題が発生したかどうかをお知らせください。ただし、確認できる既知の事実があります。

0-適切なドライバーを使用してデータベースに接続し、正しい接続方法を使用していることを確認します(たとえば、ODBCを使用すると、ネイティブドライバーよりも低速になる場合があります)。プール。

1-正しいデザインを持っている。

2-結合を高速化するために、PKとFKを同じデータ型で定義します。

3-自明でないサイズのテーブルのPKおよびFKにインデックスを作成する

4-適切なタイプのインデックスを選択する

5-選択を最適化します。 「SELECT *」を避け、必要がない限りテーブルに結合しないでください。

6-返されるデータ行の数が手元のビジネス機能を実行するのにちょうど十分であるように、選択を適切に修飾します。必要がない限り、常にすべてのデータを返さないでください。

7-クエリで大きなバイナリオブジェクトを使用することは避けてください。可能であれば、写真をデータベースからファイルシステムストレージに削除することを検討してください。

8-集約関数とORDER BYを賢く使用してください。可能であればソートを回避できるように、クラスタリングインデックスを選択してください。

8a-Not in WHEREの使用を避け、複雑な変換操作を避けてください。

8b-クエリでインデックスが使用されていることを確認します。それ以外の場合は、クエリを調整してインデックスを利用するか、必要なインデックスを作成します。

9-可能であれば、複数の列ではなく、単一の列を使用してキーを作成します。

10-テーブルとインデックスの物理的な設計を確認します。スペースがどのように割り当てられているかを確認する

11-インデックスの再構築とファイルシステムのデフラグを検討する

12-全文検索を微調整するための戦略を確認します(使用している場合)-参照: [〜#〜] fts [〜#〜]

13-ネットワーク速度が十分かどうかを判断します。

14-ASP.NETアプリケーションのトランザクション時間と、コンソールで実行したときの同じクエリまたはトランザクションを比較します。違いは近いはずです。大きな変動を見つけた場合、問題は接続方法、ネットワーク、またはその他の問題である可能性があります。

4
NoChance

データベースの書き込みは、プログラムを高速化できる唯一の場所ですか。ユースケースに関する詳細情報がなくても、ライトビハインドキャッシュのトポロジを使用することは可能ですか?

後書きキャッシュを使用すると、要素をキャッシュに入れて、後日データベースに書き込むことができます。それ以上の依存関係がないデータベースエントリ(設定された期間内にデータベースから読み取られるなど)の場合、要素がキャッシュに入ると、アプリケーションに関する限りデータベースにあるため、これは理想的です。

これは、 後書きキャッシュを実装する の方法に関するehcacheです。また、後書きキャッシュがアプリケーションからデータベースのボトルネックを取り除く方法を示す適切なビデオにもリンクしています。 http://vimeo.com/21193026

3
Richard

ここで一般的に起こり得るいくつかのこと:

  1. クエリは遅いです。 MySqlインスタンスでクエリを直接実行します。早くホストしますか?数秒かかる場合は、追加のインデックスなどを使用してクエリを調整する必要があります。
  2. ネットワークを介して受信するデータが多すぎます。クエリは瞬時に実行される可能性がありますが、ネットワークを介して送信されるデータの量が多すぎます。より少ないデータを返すか、クライアントにデータをページングすることは、いくつかの提案です。
  3. サーバーは本当にビジーです。サーバーのCPUとメモリはどのようになっていますか? 100%に近いですか?

プリペアドステートメントは、サーバーに大量のクエリが送信されるまで、それほど大きな違いはありません。速度的に準備されたものと準備されていないものはほぼ同じですが、準備されたステートメントを使用すると、サーバーはそれほどハードに動作する必要がないため、他のことを行うためにより多くのリソースを使用できます。

1
Jon Raynor

最初に考慮すべきことは、インデックスが正しいかどうかです。クエリはサージ可能ですか(つまり、インデックスが存在する場合は使用できますか)?外部キーフィールドにインデックスが付けられていますか?

次に、セットベースの方法で処理を行うか、データベースでは遅くなることが多いレコードをループ処理します。

既知のパフォーマンスキルテクニックを使用していますか?トピック。

Select *を使用していて、特に少なくとも結合フィールドが繰り返される結合で、必要以上のデータを返していますか?.

1
HLGEM