6

次のクエリがあります。これは、1つのテーブルからのみデータをフェッチします。

編集: オートコンプリート関数のデータを返すことになっているクエリです。

  1. オートコンプリートデータは、text1またはになりtext2ます。
  2. 完全一致が一番上にある必要があります。int3は整数の重み値であり、結果の順序はこれに基づいています。最初の2つのクエリは、完全一致を識別するためにここにあります。
  3. 次の2つのクエリは、一致に近いものを識別するためのものです。WHERE text1 > 'foo' AND text1 < 'fop'フレーズは実際にはに等しいWHERE text1 LIKE 'foo%'。インデックスの恩恵を受けるために、このように書きました。

お役に立てれば。

SELECT DISTINCT text1 as Key, 'text1' as Source, int1 as Count, 1000 as int3 
   FROM mytable 
   WHERE text1 = 'foo' 

UNION SELECT DISTINCT text2 as Key, 'text2' as Source, int2 as Count, 1000 as int3 
   FROM mytable 
   WHERE text2 = 'foo' 

UNION SELECT text1 as Key, 'text1' as Source, int1 as Count, MAX(int3) as int3 
   FROM mytable 
   WHERE text1 > 'foo' AND text1 < 'fop' AND Count < 4 
   GROUP BY Key 

UNION SELECT text2 as Key, 'text2' as Source, int2 as Count, MAX(int3) as int3 
   FROM mytable 
   WHERE text2 > 'foo' AND text2 < 'fop' AND Count < 4 
   GROUP BY Key 

ORDER BY int3 DESC, Count, Key LIMIT 0, 15;

テーブル構造は次のとおりです。

CREATE TABLE mytable (text1 TEXT, text2 TEXT, 
                      int1 NUMERIC, int2 NUMERIC, int3 NUMERIC);

正常に動作しますが、パフォーマンスを微調整する必要があります。さまざまなインデックスオプションを試し、組み込みのタイマーを使用してパフォーマンス結果を確認しました。

私が発見した最良のインデックス作成オプションは次のとおりです。

CREATE INDEX cmp1 ON mytable (text1 ASC, int1 ASC, int3 DESC);
CREATE INDEX cmp2 ON mytable (text2 ASC, int2 ASC, int3 DESC);

より優れたインデックス作成オプションまたはより優れたパフォーマンスのSQLクエリを教えていただければ幸いです。

4

1 に答える 1

4

UNION両方のサブクエリに表示される重複行を削除するため、結果の一時テーブルを作成する必要があります。

サブクエリが明確であることを保証できる場合、またはそれらの重複を気にしない場合は、UNION ALL代わりにを使用してください。

(あなたの場合、インデックス付けされていない値で並べ替えるには、int3とにかく一時テーブルが必要です。)


サブクエリを最適化するには、でサブクエリを実行して、EXPLAIN QUERY PLANインデックスを使用しているかどうかを確認します。

LIKEインデックスが正しく宣言されていることを確認する場合に使用できます。LIKE最適化を参照してください。

インデックスの作成方法の説明については、クエリプランニングを参照してください。2つのインデックスが最適のようです。

于 2012-09-26T19:30:33.550 に答える