2017-12-09 1 views
1

パフォーマンスはどのようにSQLite3 REGEXP演算子ですか?私はEXPLAINからの出力を比較して理解しようとしている単一の列patternとインデックスSQLite3正規表現のパフォーマンス

CREATE TABLE `foobar` (`pattern` TEXT); 
CREATE UNIQUE INDEX `foobar_index` ON `foobar`(`pattern`); 

SELECT * FROM `foobar` WHERE `pattern` REGEXP 'foo.*' 

のようなクエリを持つ単純なテーブルを想定して簡単にするために

、およびそれはLIKEを使用するのと似ているようですが、マッチのためにregexpを使用する点が異なります。しかし、私はEXPLAINからの出力をどのように読むべきかは十分には分かっていないし、パフォーマンスがどのようになるのか把握できていない。

インデックス付きのWHERE `pattern` = 'foo'クエリと比較して遅くなることは理解していますが、それはLIKEと遅くなりますか?

答えて

3

インデックスを使用するためにsqliteはWHERE ... REGEXP ...を最適化しません。 x REGEXP yは単なる関数呼び出しです。 regexp(x,y)に相当します。また、sqliteのすべてのインストールにregexp関数が定義されているわけではないので、それを使用する(またはREGEXP演算子)ことはあまり移植性がありません。一方、LIKE/GLOBsome additional conditions are metことを提供プレフィックスクエリ用のインデックスを利用することができます:LIKEまたはGLOBの

  1. 右辺はリテラル文字列または文字列にバインドされたパラメータのいずれかでなければなりませんワイルドカード文字で始まらないリテラル。
  2. LIKEまたはGLOB演算子を、左側に文字列またはBLOBの代わりに数値を指定することでtrueにすることはできません。つまり、 LIKEオペレータまたはGLOB演算子の左側が、TEXT類似性を持つ索引付き列の名前または 右側のパターン引数がマイナス記号( " - ")で始まらないか、または数字。 この制約は、数値が辞書順にソートされないという事実から発生します。たとえば、9 < 10ですが、 '9'> '10'です。
  3. LIKEおよびGLOBを実装するために使用される組み込み関数は、sqlite3_create_function()APIを使用してオーバーロードされていてはなりません。
  4. GLOB演算子では、組み込みのBINARY照合シーケンスを使用して列のインデックスを作成する必要があります。
  5. LIKE演算子の場合、case_sensitive_likeモードが有効な場合、列はBINARY照合シーケンスを使用して索引付けする必要があります。または、case_sensitive_likeモードが無効の場合、列は組み込みのNOCASE照合シーケンスを使用して索引付けする必要があります。
  6. ESCAPEオプションを使用する場合、ESCAPE文字はASCIIまたはUTF-8のシングルバイト文字でなければなりません。
+0

私が正しく理解していれば、regexpはテーブル全体をスキャンし、 'regexp(pattern、 'foo。*')'を呼び出して一致するものを見つけますか? – ext

+0

正しい。 'EXPLAIN QUERY PLAN'でそれを見ることもできます。 – redneb