与えられた検索文字列sに対して、s.startsWith(value)== trueになるように、インデックス付きのvarchar(255)フィールド(〜1m行)から値を探したい。SearchStringの開始値を見つける
例: S = "Hello World" の
マッチ: "H"、 "こんにちは"、 "Hello World" の
が可能ということですか?
与えられた検索文字列sに対して、s.startsWith(value)== trueになるように、インデックス付きのvarchar(255)フィールド(〜1m行)から値を探したい。SearchStringの開始値を見つける
例: S = "Hello World" の
マッチ: "H"、 "こんにちは"、 "Hello World" の
が可能ということですか?
あなたは1つが、ほとんどの場合、どうなるよりも、反対の引数でINSTR
を使用することができます。
SELECT *
FROM mytable
WHERE INSTR('hello world', mycol) = 1
これはmycolは「こんにちは世界」は、任意のだから、位置1から始まるの部分文字列を持つレコードを返します。以下は一致します:
時間
彼
HEL
地獄(スペースを末尾付き) ハロー
ハロー
ハローワット
ハロー
WO ハローWOR
ハローワール
のHello World
あなたは多分、次の冗長を加えて、より良いパフォーマンスを得ることができますSQLエンジンにmycolのインデックスを選択させるヒントがあります。
インデックスを使用しても、出力が高速になるわけではありません。値を持つテーブルを想像:
HEL
helaaaaaaa
helaaaaaab
helaaaaaac
...(1000のよりそのような記録、そして最終的に:)
のHello World
..エンジンはまだすべてのレコードをスキャンし、最初と最後を取得します。このクエリを実行しているアプリケーションがある場合は
、あなたはそれがこのようになりますように、それは、動的SQLを作成してみましょうことができます:
SELECT *
FROM mytable
WHERE mycol IN ('h', 'he', 'hel', 'hell', 'hello', 'hello ', 'hello w',
'hello wo', 'hello wor', 'hello worl', 'hello world')
これは潜在的に最高のパフォーマンスを持っているでしょう。それはそれをしない場合は、確かにこの精巧なSQLはそれを行います。
SELECT * FROM mytable WHERE mycol = 'h'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'he'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hel'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hell'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello '
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello w'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello wo'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello wor'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello worl'
UNION ALL
SELECT * FROM mytable WHERE mycol = 'hello world'
あなたはこのためにlike
を使用したい:
where col like 'hello%' -- or whatever
または
where col like concat(@s, '%')
理由like
を使用すると、パターンがワイルドカード文字で始まらないため、索引を使用できるということです。
編集:
論理が逆転している可能性があります。もしそうなら、あなたはまだのように使用することができます。この場合
where @s like concat(col, '%')
列は関数の引数であるので、しかし、インデックスは、使用することはできません。
私はそれを試してみましょう、しかし、インデックスが使用できない場合、それは遅すぎるのではないかと心配しています。 – hansmaad
"like"をSQLで使用できます。
は `= 1 'で使用する場合は、 '時間%'
ようCOLUMNNAMEはインデックスが、ここで使用されるのでしょうか?tableNameの から選択しますか* – hansmaad
あなたのインスタンスで 'EXPLAIN PLAN'をチェックすることができます。そうでない場合は、 'AND mycol like 'h%''を追加することができます。これは重複していますが、エンジンがインデックスを使用する利点を検出するのに役立ちます。 – trincot
良いアイデア、とにかく分かりやすい長さだと思いますので、追加の 'hel%'を使うことができます – hansmaad