MySQLのためのオーバーヘッドがSELECTS - ワンを使用する方、または順序で多くの

StackOverflow https://stackoverflow.com/questions/1852739

質問

500行を返す1つのSELECT foo, bar, FROM usersクエリを有し、500個のSELECT foo, bar, FROM users WHERE id = xクエリが一斉に来て間かなりのパフォーマンスの違いはありますか?

私が書いているPHPアプリケーションでは、私は約500 SELECT文を生成するコードの書き込みを明確、読みやすいセクションの間で選択しようとしています。または500行を返す唯一のSELECTを使用するあいまいな、複雑な方法でそれを書きます。

私は明確で、保守性のコードを使用する方法を好むだろうが、私はのSELECTのそれぞれについて、接続のオーバーヘッドは、パフォーマンス上の問題を引き起こすだろうと心配しています。

の背景情報、ケースにはそれが関連するのです。 1)これはPHPでコーディングされ、Drupalのモジュールです。 2)問題のテーブルは非常に少数のINSERTとUPDATEを取得し、稀にロックされていません 3)SQLのJOINの質問

に関連していない理由のために可能ではありません

ありがとうございます。

役に立ちましたか?

解決

これは、SELECT一つの大きなバッチを実行すると、1行について選択の膨大な量をしているよりも、アプリケーションコードで結果を解析するために、ほとんど常に高速です。でも、私はあなたが両方を実装し、それらをプロファイリングすることをお勧めします。常にあなたが行う必要があり仮定の数を最小限にするために努力しています。

他のヒント

私はあなたがすべてのクエリとの間の接続をクローズされていない場合は特に、あまりにも多くのMySQLのクエリの接続のオーバーヘッドを心配しないでしょう。あなたのクエリが一時テーブルを作成する場合、クエリのオーバーヘッドがかかったよりも、すでにクエリで多くの時間を費やしてきたことを考えてみます。

私は個人的には、複雑なSQLクエリをやって大好きですが、私が見つけたことすべてが違いを作る(偶数インデックスに対して)の範囲チェックを行う必要があります。<テーブル、MySQLのクエリキャッシュとクエリのクエリのパフォーマンスのサイズ/ P>

私はこれを提案します:

1)のシンプルな、正しいベースラインを確立します。の私は、これは無数問合せアプローチである疑いがあります。これは間違っている、と非常に高いhelfully正しくありません。それを数回実行し、クエリキャッシュとアプリケーションのパフォーマンスを監視します。アプリの保守性を維持する能力は、あなたが他のコードのメンテナで作業する場合は特に、非常に重要です。あなたが本当に大きなテーブルを照会している場合にも、小さなクエリは、拡張性を維持します。

2)のコードの複雑なクエリ。の精度の結果を比較して、時間。そして、スキャンした行が何であるかを確認するためにクエリにEXPECTを使用。私はよく、私は常に更新なってきテーブルにいる場合は特に、私は、JOIN、あるいはWHEREのx!= yの、または一時テーブルを作成し、条件を持っている場合、クエリのパフォーマンスはかなり悪い得ることができることを見出しました。しかし、私はまた、複雑なクエリが正しくない可能性があること、およびアプリケーションの成長に合わせ、複雑なクエリをより簡単に破ることができることを発見しました。複雑なクエリは、一般的に、行の大きなセットをスキャンし、多くの場合、一時テーブルを作成し、using whereスキャンを起動します。テーブルが大きいほど、これらのより高価で入手します。また、あなたは複雑なクエリは、あなたのチームの強みに合わないチームの考慮事項がある場合があります。

3)あなたのチームで結果を共有します。

複雑なクエリは、MySQLのクエリキャッシュにヒットする可能性が低い、と彼らは十分な大きさであるならば、それらをキャッシュしません。 (頻繁にクエリを打つためにあなたは、MySQLのクエリキャッシュを保存したい。)また、同様に行うことはありませんインデックスをスキャンする必要がクエリ述語。 (X!= Y、X> Y、X SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360'のようなクエリは、スキャンをやってしまいます。 (クエリのオーバーヘッドのコストは、その場合には無視できる程度であってもよい。)

小クエリは、あなたが選択し、上の叙述しているフィールドがインデックス化される限り、インデックスからすべての値を取得することにより、単に一時テーブルを作成することなく、多くの場合、完了することができます。だから、SELECT foo, bar FROM users WHERE id = xのクエリのパフォーマンスは本当に素晴らしいです(ESPの場合、列のfoobaralter table users add index ix_a ( foo, bar );、別名のようにインデックス化されている。)

あなたのアプリケーションでパフォーマンスを向上させる

他に良い方法は(該当する場合)アプリケーションでそれらの小さなクエリ結果をキャッシュすること、またはマテリアライズド・ビュー・クエリのバッチジョブを実行します。また、memcachedのかXCacheとで見つかったいくつかの機能を検討します。

あなたは500のid値が何であるかを知っているように、

これはと思われるので、このような何かをしない理由ます:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top