LIKE
最も人気のあるデータベースのSQL演算子の複雑さを知っている人はいますか?
3 に答える
3つのコアケースを別々に考えてみましょう。この説明はMySQL固有ですが、インデックスは通常同様の方法で実装されるため、他のDBMSにも当てはまる可能性があります。
LIKE 'foo%'
インデックス付きの列で実行すると高速です。MySQLインデックスはBツリーのバリエーションであるため、このクエリを実行すると、に対応するノードfoo
、またはそのプレフィックスを持つ最初のノードにツリーを下降し、ツリーを前方にトラバースできます。これらはすべて非常に効率的です。
LIKE '%foo'
インデックスによって高速化することはできず、全表スキャンになります。インデックスを使用して実行できる他の基準がある場合は、最初のフィルタリング後に残っている行のみがスキャンされます。
ただし、トリックがあります。たとえば、接尾辞の照合を行う必要がある場合.foo
(たとえば、拡張子が付いたファイル名を検索する場合)、元の列と同じ内容で文字の順序が逆の列を追加することで、同じパフォーマンスを実現できます。
ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);
col
thenで終わる行を検索すると、次の.foo
ようになります。
SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'
最後に、LIKE '%foo%'
ショートカットがないがあります。行数を実行可能な数に減らす他の制限基準がない場合、パフォーマンスに大きな打撃を与えます。代わりに全文検索ソリューション、またはその他の特殊なソリューションを検討することをお勧めします。
RDBMS、データ(および場合によってはデータのサイズ)、インデックス、およびLIKEの使用方法(プレフィックスワイルドカードの有無にかかわらず)によって異なります。
あなたはあまりにも一般的な質問をしています。
パフォーマンスへの影響について質問している場合:
likeの問題は、データベースがインデックスを使用できないようにすることです。Oracleでは、インデックスはもう使用されていないと思います(ただし、まだOracle 9を使用しています)。ワイルドカードが最後にある場合、SqlServerはインデックスを使用します。他のデータベースについては知りません。