2

LIKE最も人気のあるデータベースのSQL演算子の複雑さを知っている人はいますか?

4

3 に答える 3

12

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);

colthenで終わる行を検索すると、次の.fooようになります。

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

最後に、LIKE '%foo%'ショートカットがないがあります。行数を実行可能な数に減らす他の制限基準がない場合、パフォーマンスに大きな打撃を与えます。代わりに全文検索ソリューション、またはその他の特殊なソリューションを検討することをお勧めします。

于 2009-04-29T11:54:51.830 に答える
1

RDBMS、データ(および場合によってはデータのサイズ)、インデックス、およびLIKEの使用方法(プレフィックスワイルドカードの有無にかかわらず)によって異なります。

あなたはあまりにも一般的な質問をしています。

于 2009-04-29T11:48:24.483 に答える
1

パフォーマンスへの影響について質問している場合:

likeの問題は、データベースがインデックスを使用できないようにすることです。Oracleでは、インデックスはもう使用されていないと思います(ただし、まだOracle 9を使用しています)。ワイルドカードが最後にある場合、SqlServerはインデックスを使用します。他のデータベースについては知りません。

于 2009-04-29T11:50:52.853 に答える