2016-12-29 7 views
0

私はテーブルを持っていて、カラムの1つはTEXTタイプです。私は与えられた文字列に似たテキストを持つ行をテーブルから検索する必要があります。MySQL:クエリで始まるTEXTフィールドで行を検索する

文字列がかなり長い(10000バイトと言えば)ので、私は文字列の最初の20バイトだけを比較するのに十分であると判断しました。私は入れ

SELECT * FROM `table` WHERE STRCMP(SUBSTRING(`description`,0,20),'string_to_compare') = 0 

または

SELECT * FROM `table` WHERE `description` LIKE 'string_to_compare%') 

注:

KEY `description` (`description`(20)) 

だから私は今、何をしたいのか、次のクエリのいずれかです。私は、キーを作成し速く、この検索を実行するにはの末尾に1つしかパーセント記号がありませんstring_to_compare私は最初のバイトだけを比較したいとDBに言っています。

私は、MySQLの頭脳がキーを使用して余分な動きをしないことを願っています。

質問:

  1. クエリが優れている任意の違いはありますか? DBエンジン(MyISAM)がより分かりやすくなるように、私は個人的には2番目を好みます。
  2. MyISAMがこれらのクエリに効率的なコードを作成するのは正しいですか?
  3. PDOのprepare文に '%'を挿入するにはどうすればよいですか? SELECT * FROM table WHERE description LIKE ":text%"
+1

MyISAMが死にそうです。それを使用しないでください。 –

+0

ありがとう、@RickJames –

答えて

1
  1. はい、違いがあります。 WHERE条件が列値の関数を呼び出すと、インデックスは使用できません。私はあなたのSUBSTRING()コールがテキストのインデックス部分と一致し、それを使用していることに気づくとは思わない。一方、LIKEは、索引を使用できるケースを認識するように特別にコード化されています。また、2つの文字列を比較する場合は、ではなく=を使用してください。

    WHERE SUBSTRING(`description`,1,20) = 'string_to_compare' 
    
  2. 私はそれがLIKEバージョンのための効率的なクエリを作ると信じています。

  3. プレースホルダを引用符で囲むことはできません。それを組み合わせるにはCONCAT()を使用してください:WHERE description LIKE CONCAT(:text, '%')。または、プレースホルダーにバインドするPHP変数の末尾に%を置き、WHERE description LIKE :textを使用することもできます。
+0

ありがとう! STRCMP()関数の代わりに '='を使用する理由についてコメントできますか? –

+1

主な理由は、意図がより冗長で明確であるからです。それは最適化されている方が良いかもしれません。単一の式で上位、下位、または等価を区別する必要がある場合は、STRCMP()を使用してください。 – Barmar

関連する問題