• 締切済み

Index の使い方、where a.カラム1 LIKE CONCAT

Index の使い方、where a.カラム1 LIKE CONCAT(b.カラム2,'%') お世話になります。 テーブルA: id phone ----------------------------------- 1 819011112222 2 819022223333 3 81312345678 4 651112222 5 8699998888 6 819011112222 テーブルB: id Name Pref --------------------------------------------------- 1 Japan-1 8131234 2 JP-Mobile 8190 3 China-1 869 4 China-2 868 5 Japan-2 813 6 Japan 81 7 Singapore 65 このようなテーブルで、テーブルBはレコード数が数千件あります。 数千件でしたし、データを取るのに遅いとは思いますが、 なんとか耐えらえた範囲なので下記のように実行しておりました。 select a.*,b.Name,b.Pref FROM テーブルA a, テーブルB b where a.phone LIKE CONCAT(Pref,'%') group by a.id; 結果 id phone Name ---------------------------------------------------- 1 819011112222 JP-Mobile 2 819022223333 JP-Mobile 3 81312345678 Japan-2 4 651112222 Singapore 5 8699998888 China-1 5 862223333 China-2 6 819011112222 JP-Mobile テーブルB Prefに対してIndexを作成していますが、どうも作動していないようです。 Indexに関してよく理解できていなかったので、気にしていなかったのですが、今回早さを比べる為に Indexあり、なしで試しみても大して変っていませんでした。 今のところ、Indexを使えていなくても問題ないのですが、今後テーブルBのデータが数万件に増えてしまい、今までのやり方が通用しません。 効果的に使用する方法をアドバイス頂けませんでしょうか。 よろしくお願いします。

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

like検索は、indexが効きにくいです。先頭が固定値ならまだしも、他のtable からひっぱるのでは、まったく利用されないでしょう。 table のjoin を工夫すれば、まだいけるかな? 件数の多いB table にindex を貼るとして、そのindex を貼ったカラムと=で比較できる条件文に変更できれば、join に際してindexが利用されるのでは? よって、テーブルB Pref の文字数が4桁固定で有れば select a.*,b.Name,b.Pref FROM テーブルA a left join テーブルB b on b.Pref = substring(a.phone, 1, 4) ; left join で、テーブルA の全行が選出されて、テーブルAの各行に対し、この条件文だとたぶんテーブルBからは一行選出されるので、group by は不要になるとおもう。 pref の文字数不定だと、難しいです。先にテーブルAにも、pref のみ入れるカラムを作った方が速そうです。テーブルAは、数千もないのですよね? あと、先頭に explain を付けて実行してみると、index を使っているかどうかが解ります。 possible_keys か key カラムにindex名が入ります。

すると、全ての回答が全文表示されます。

関連するQ&A