次のクエリがあります。これは、1つのテーブルからのみデータをフェッチします。
編集: オートコンプリート関数のデータを返すことになっているクエリです。
- オートコンプリートデータは、
text1
またはになりtext2
ます。 - 完全一致が一番上にある必要があります。
int3
は整数の重み値であり、結果の順序はこれに基づいています。最初の2つのクエリは、完全一致を識別するためにここにあります。 - 次の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クエリを教えていただければ幸いです。