2010-12-04 19 views
3

クエリが大きく、WHERE句に長いLIKEテストリストが含まれています。SELECT cola FROM t WHERE(colX LIKE 'word1%word2%'またはcolX LIKE 'word3%word4%' OR ...);WHERE句に 'LIKE word%word2'を含むmysql SELECTがインデックスを使用しないのはなぜですか?

colXにはインデックスがあります。比較は '%'で始まらないので、mysqlはインデックスを使用します。 EXPLAINで確認すると、SQL文字列が大きくなると、インデックスを使用しているmysqlが停止し、フル・テーブル・スキャンを開始します。これはwhere節の 'LIKE'テストの数に関係しているようです。スレッショルドでもう1つの 'LIKE'を追加することができ、インデックスの使用をやめ、余分な 'LIKE'なしで10倍の時間がかかります。

このような動作を制御するいくつかのmysql変数がありますか?

+1

'OR'ではなく' UNION'を実行するようにクエリを書き直すとどうなりますか?同じ動作をしますか? –

+0

UNIONに分割すると、インデックスが使用されます。私はLIKEの長いリストを四半期に分割して索引を使用するようにしなければならなかったので、LIKEの数と関係があるようです。パフォーマンスが大幅に向上しました。たくさんの好きな点があれば、オプティマイザがどうしてそんなに悪くなるのか? – globallyunique

答えて

1

FORCE INDEX [index_name]を追加すると、インデックスを使用すると思います。また、Hint index documentationをチェックしてください。 sysvar_max_seeks_for_keyの値は、インデックスが使用されているかどうかにも影響します。おそらく、この値を小さい数値に変更すると役立ちます。

関連する問題