2017-07-27 3 views
0

私のクエリです。varcharおよびint列のマルチインデックス。しかし、フルテキストにする必要があります

select distinct p_code from myTable 
    where ((INSTR(LOWER(subject), LOWER('jpg'))))  
    order by code1, code2 limit 400,20; 

p_code : INT 
subject : VARCHAR 
code1 : INT 
code2 : INT 

INSTR(subject)があり、その後、私はフルテキストインデックスにsubjectに列を追加する必要があります。

さらに、order by code1, code2があるので、私はこれらの3列(subject, code1, code2)にインデックスを追加する必要があると思います。

しかし、あなたが知っているように、INTカラムのためにフルテキストインデックスを追加することはできません。

この場合、どうすればよいですか?

+1

全文索引を使用して、結果の順序を最適化することはできません(列のタイプは問わない)。また、 'match()と()'のためだけに、 'INSTR(subject)'の全文索引を使うことはできません。あなたのテーブルに 'jpg'という数が非常に限られていない限り、おそらく '(code1、code2)'のインデックスであり、 '(code1、code2、p_code、subject) 'に拡張するのが最もよいでしょう。 ''%jpg% ''のような主題はあなたの状態を書いているより一般的な方法でしょう(それほど高速ではありません)。また、実際にページネーションを実装することを意図している場合は、それを実装する他の方法もあります。 – Solarflare

+0

@Solarflare 'match()と()'が答えました!クエリの実行時間が大幅に改善されました(6s - > 0.15s)。どうもありがとう。 – Deckard

+0

私はうまくいきますが、フルテキスト検索はinstrとは違って動作するため、期待通りの結果が得られるようにしてください。 'myjpg'、そして' jpg * 'を使わない限り、' jpged'ではなく 'jpg'を使います。また、最小単語長(デフォルト:3/4)にも注意してください。そして、単語が比較的一般的になってくると、それは遅くなるでしょう。だからこそ、Rickと私はここで全文検索が実行可能であるとは思っていませんでした。ほとんどの行で/そのファイル拡張子を持つようなデータを前提にしていました。 (そうであれば、より一般的なものでテストしてください)。 – Solarflare

答えて

1
where ((INSTR(LOWER(subject), LOWER('jpg')))) 

- >

where subject LIKE '%jpg%' 

またはおそらく

where subject LIKE '%jpg' 

_ciで終わるsubjectの照合を使用しています。

しかし、テーブル全体をスキャンする必要があるため、クエリの速度が大幅に向上することはありません。

INDEX(code1, code2)を追加しても、オプティマイザがそれを使用すると、OFFSETが増えてゆっくりと遅くなります。しかし、これは解ける - remembering where you left offによって。

FULLTEXTはお手伝いできません。一方

...

あなたが時々(あるいはしばしば)であったextent列を持っていた場合、 "JPG"、そして

where `extent` = 'jpg' 

INDEX(extent, code1, code2) 

はないだろうテーブルスキャンを行う必要があります。 (でも、 "ページネーション"に関する私のリンクが適用されます)

関連する問題