0

データベースでいくつかのユーザー入力パターンを検索する必要があります。
MysqlSELECTステートメントのwhere句で正規表現を使用するのは効率的ですか(インデックス付き列の10000行のスケールで)?
私の検索は日付であり、次の3つの形式にすることができます。

  • 2012一致する必要があります20122012/*2012/*/*
  • 2012/10一致する必要があります2012/102012/10/*
  • 2012/10/3それだけに一致する必要があります2012/10/3

注:このタイプの一致を個別にチェックする必要がある3つの列があります。

4

2 に答える 2

2

MySQLのドキュメントで明確な参照を見つけることはできませんが、インデックス構造のため、正規表現の一致ではインデックスルックアップを使用できません

全表スキャンの代わりに正規表現を使用してインデックスをスキャンする場合がありますが、正規表現検索はほぼ全表スキャンと同等です。

正規表現が定数文字列で始まる場合は、クエリを次のように構成することをお勧めします。

SELECT * FROM TableA WHERE field LIKE 'tr%' AND field RLIKE 'tr[uae].*'

LIKEからインデックスのヘルプを取得します。これは、文字列の先頭から一致した場合に、インデックスを有利に使用できます。

編集:選択はかなり単純で、文字列の先頭から一致するため、LIKEを使用してそれらを機能させることができます。これにより、インデックスがうまく利用されます。

SELECT * FROM TableA WHERE field1='2012' OR field1 LIKE '2012/%'
SELECT * FROM TableA WHERE field1='2012/10' OR field1 LIKE '2012/10/%'
SELECT * FROM TableA WHERE field1='2012/10/3'

比較を2つに分割する理由は、両方のケースをカバーするLIKEだけ2012/1と一致する検索を回避するためです2012/10(つまりLIKE '2012/1%')。

于 2012-10-02T21:00:24.030 に答える
0

これは、LIKEが正規表現をパラメーターとして受け入れることを想定していないために発生します。そのようなもののための正規表現があります

WHERE field NOT REGEXP '%_[0-9]+'
于 2012-10-02T20:57:11.677 に答える