2016-07-27 10 views
2

これはInnoDB for MySQL 5.7用です。私が持っている場合はMySQL - 文字列比較のためのインデックス作成

ようなクエリ:

SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0 

は、それがクエリで使用することができますDにインデックスを持つことは可能ですか?すなわち、STRCMP関数のbtreeインデックスを使用するのに十分なほどスマートですか?

もしそうでなければ、私はDで文字列の比較を行うことができるようにクエリ(および/またはテーブル)を再設計することができますし、すべての単一のヒットする必要がないように行?

+0

use:%somestring% – kollein

+0

@kolleinのように:ごめんなさい、このコメントはどのように関連していますか?まず、%somestring%では、可変接頭辞のために、索引付けはオフになっています。第二に、私は文字列の比較を行い、部分文字列マッチングではない。 –

答えて

3

アメージングどのように多くの間違った答え今のところ。私が彼らに参加できないかどうか私に見せてください。

STRCMPは、引数の比較方法に応じて、-1,0または1を返します。

STRCMP(D, 'somestring') > 0D > 'somestring'と同じです。 (未>=、ない=、ないLIKE

実は、そこ照合の違いかもしれないが、必要であれば、それは扱うことができます。

INDEXesを使用しているすべての関数および特定の演算子、「非表示」列。 D > 'somestring'は、Dで始まるインデックスの恩恵を受けることができます。 STRCMPバージョンはできません。

+0

ありがとう@ rick-james! (また@ydoowと@myke-bryantにも)。これはばかげているかもしれませんが、文字列オペランドで ">"などを使用できることはわかりませんでした。 –

0

Mysqlは関数呼び出しにインデックスを使用しません。

クエリ以下

使用し、これは活用します

create index index1 on TABLE(D); 
2

なぜだけではなく、

WHERE D > 'somestring' 

以下のクエリを使用してインデックスを作成するD

SELECT A, B, C FROM TABLE WHERE D ='somestring' 

にインデックスを作成します。列の典型的なBツリーインデックスD

1

列の値をSTRCMP()などの関数に渡すだけで比較を実行すると、インデックスに値はありません。

リファレンス:https://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html

B-treeインデックスは=>>=<<=、又はBETWEEN演算子を使用する式の列の比較のために使用することができます。

LIKEはより厳格であり、あなたは何を期待することができながら、だから、あなたは、代わりに

SELECT A, B, C FROM TABLE WHERE D > 'somestring'

を使用することができます。

また、COLLATE演算子を使用して、大文字と小文字を区別する照合に変換して大文字と小文字を比較することもできます。

SELECT A, B, C FROM TABLE WHERE D > 'somestring' COLLATE utf8_bin

+0

ワイルドカード文字なしの 'LIKE'は' = 'と同じです。私は、OPの意図はソートメカニズムのようなものだと思う - Dがテーブルレコードが比較されている文字列よりも大きい(英数字のソート用語で)すべてのレコードを返す。 –

+0

それを指摘してくれてありがとう@MikeBrant。私はその質問を見落とし、間違ってしまった。それに応じて訂正された答え。 – ydoow