1

いくつかの内部結合と where 句を含むかなり単純な mysql クエリがあります。結合と主キーで使用されるすべての列のインデックスを作成しました。IN 演算子を含む where 句もあります。5 つ以下の ID のみが IN 句に渡されると、クエリ オプティマイザーはインデックスの 1 つを使用して、適切な時間内にクエリを実行します。Explain を使用すると、タイプが範囲で、キーが PRIMARY であることがわかります。私の問題は、IN 句で 5 つを超える ID を使用すると、オプティマイザーが使用可能なすべてのインデックスを無視し、クエリの実行が非常に遅くなることです。Explain を使用すると、タイプが ALL でキーが NULL であることがわかります。

ここで何が起こっているのか、どうすればこれを修正できるのか、誰かに光を当ててください。

ありがとう

4

3 に答える 3

0

私が抱えている同様の問題を調べているときにこれを見つけました。私の調査結果は、将来、同様の問題を抱えている他の人に役立つかもしれないと思いました。

約30行のMyISAMテーブルがあります(元のタイプミスと代替単語の両方が有効なスペルである可能性がある検索で、類似した単語の一般的なタイプミスが含まれています。テーブルのサイズは徐々に大きくなります)。ただし、私にとってのカットオフは、IN句に4つの項目がある場合はインデックスが使用されますが、IN句に5つある場合はインデックスが無視されることです(代替単語を試したことがないため、IN句の実際の個々の項目に注意してください)要因かもしれません)。OPと非常に似ていますが、単語数が異なります。

インデックスの使用は機能せず、インデックスは引き続き無視されます。インデックスの指定は避けたいと思いますが(誰かがインデックスを削除した場合に備えて)、強制インデックスは機能します。

一部のテストでは、IN句に80個のアイテムがある場合でも、クエリで関連するインデックスを使用する1000個のランダムな一意の行をテーブルに追加しました。

したがって、MySQLは、テーブルの行数と比較したIN句の項目数に基づいてインデックスを使用するかどうかを決定するようです(おそらく他のいくつかの要因が関係しています)。

于 2013-02-08T09:59:42.077 に答える
0

Mysql Index Hints を使用することもできます。クエリの実行中に使用するインデックスを指定できます。

例:

 SELECT * FROM table1 USE INDEX (col1_index,col2_index)
  WHERE col1=1 AND col2=2 AND col3=3;

-

SELECT * FROM table1 IGNORE INDEX (col3_index)
  WHERE col1=1 AND col2=2 AND col3=3;

詳細はこちら: Mysql インデックスのヒント

于 2013-01-23T15:43:27.103 に答える
0

JOIN を最適化するためのテーブルの「主キー」インデックスに関係なく、WHERE を適用する共通の基準に基づいたインデックスも必要です。クエリの列に関する詳細情報が必要ですが、WHERE 基準にもインデックスが必要です。

于 2013-01-23T14:59:24.623 に答える