• 締切済み

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のデータが数万件に増えてしまい、今までのやり方が通用しません。 効果的に使用する方法をアドバイス頂けませんでしょうか。 よろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数10

みんなの回答

  • 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

  • GROUP_CONCAT✕複数列で、違うレコード数

    MySQLで、「GROUP_CONCAT」を「複数列」に適用させ、それぞれ異なるレコードを1つにまとめようとしたのですが、 取得出来る結果が、多い方の数に引き連られてしまいます。 ざっくりとした質問でアレなのですが、これは結合の仕方が悪い、 と推測されるでしょうか? そもそも「GROUP_CONCAT」を複数列に適用させる場合、それぞれ異なるレコード数をまとまることはできるのでしょうか?。 ■期待した取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows [テーブルBカラムf] => man ■実際の取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows,windows [テーブルBカラムf] => man,man 「テーブルB」の取得結果が、「テーブルA」取得結果数に引き連られてしまいます ■SQL(抜粋) SELECT  GROUP_CONCAT(a.c) AS c,  GROUP_CONCAT(a.d) AS d,  GROUP_CONCAT(b.e) AS e,  GROUP_CONCAT(b.f) AS f FROM hoge h LEFT JOIN テーブルA a ON (h.id = a.hoge_id) LEFT JOIN テーブルB b ON (h.id = b.hoge_id)

  • MYSQL like % の使い方

    テーブルA  id phone ---------------- 1 8199992222 2 8211113333 3 8211114444 4 85233334444 テーブルB id Prefix name ------------------------- 1 81 Japan 2 82 Korea 3 852 Hong Kong テーブルBは使わず、 SELECT a.id, a,Phone, Case when a.Phone like '81%' then 'Japan' when a.Phone like '82%' then 'Korea' when a.Phone like '852%' then 'Hong Kong' else null end FROM テーブルA as a とすると、下記のようになると思いますが、”like '82%'” の部分がたくさんあり、1つづつ全て書くことができません。 一覧が テーブルBにあるPrefix なので、こちらを使って効率よくできませんでしょうか。 id phone name -------------------------------- 1 8199992222 Japan 2 8211113333 Korea 3 8211114444 Korea 4 8523334444 Hong Kong MYSQL ver: 5.0.51a 他必要な情報があればお知らせください。 宜しくお願いします。

  • likeの使い方について

    すみません。教えてください。。 ACCESSで下記2つのテーブルをunionでくっつけて nameの右端(1桁目)が同一のもの(CとCCなど)を抽出するため 下記のような構文を構築したのですが抽出されません。。 お手数ですがこちら何が原因となっているか教えていただけないでしょうか。。 よろしくお願い致します。 id name id name 1 a 1 a 2 b 2 b 3 c 3 cc 4 d 5 ee 5 e select * from (select * from tb1 union select * from tb2) as A where name like '*c' or name like '*d' or name like '*e'

  • データベースの設計で質問です。

    会社テーブルがあり、会社がサービス可能な都道府県情報を保存したい場合には、 どのように作るのがいいのでしょうか? 会社テーブルに都道府県別に47個のカラムを追加する 会社テーブル id | name | pref_1 | pref_2 | pref_3 | .... | pref_47 --------------------------------------- 1 | 会社A | 1 | 0 | 1 | .... | 0 2 | 会社B | 0 | 0 | 1 | .... | 1 という感じかなと思ったのですが、カラム数が多くなってしまい、なんとなく冗長な感じがしてしまいます。

  • INDEXと検索

    INDEXが着いていないカラムをSELECTで検索しても他のカラムにプライマリーキーがあれば、検索は高速になるのでしょか? テーブル ID、NAME IDにプライマリーキーが付いていて、NAMEのカラムのみを検索するときにも高速になるのでしょうか?

    • ベストアンサー
    • MySQL
  • ◆ FFFTP について質問 index.html ??

    ヤフオク出品で、たくさん写真を載せたいので、 ジオシティーズにFFFTPでアップロードしています。 A商品とB商品を別々に出します。 A商品は無事に成功し、出品しています。 しかし、別のB商品をアップロードしようとすると、 「index.html」がダブっていますので、できません。 上書きしたら、A商品のページ内容が変わってしまうでしょう。 A商品のURLは、 http://****.geocities.jp/(私のYahoo!ID)/index.html です。たぶん、(私のYahoo!ID)/の後に、 (私のYahoo!ID)/a/index.html (私のYahoo!ID)/b/index.html となればいいのだと思うのですが、その方法がわかりません。 どなたかぜひぜひお願いします!!!!!!!!

  • inner joinとwhereでの結合の違いは?

    お世話になります。 たとえば、テーブルが複数(この場合2つ)ある場合。 (1) test(カラム:table_id,table_name) (2) tester(カラム:table_id,table_name) 以下のクエリは条件的に select a.table_id, a.table_name from test a inner join tester b on a.table_id = b.table_id ************* select a.table_id, a.table_name from test a , tester b where a.table_id = b.table_id 同じですよね? パフォーマンス的にもjoinすることのメリットが判りません。

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • INDEXの使用するポイント

    テーブルを作成するにあたりどこまでインデックスを設定していいのかが解りません…。 たとえばID,DATE,NAME,COMMENT,ADDRESSでテーブルを作成したとしてIDをプリマリーとします。 そして目的としては全ての項目で検索する可能性があるとします。 その場合どれをインデックスに設定するのがベストなのでしょうか? 全部(IDはプリマリーななので必要なし?)の場合はINDEXを設定する必要もないのでしょうか? むしろしない方がいいのでしょうか? また、NAMEだけは検索する事は無いといった場合はどうなるのでしょうか? その場合も過半数以上設定する場合はかえって遅くなるかもしれないし必要ないとかあるんでしょうか? また、

  • Access結合後の短いテキスト型のインデックス

    Accessの検索にて、テーブルA LEFT JOIN テーブルB で外部結合し、 WHERE句でテーブルBの短いテキスト型を抽出条件にすると、検索が遅くなります。 【テーブル定義】 テーブルA( ・年月日(日付/時刻、重複ありインデックス) ・コード(短テキスト、重複ありインデックス) ・属性あ(短テキスト、重複ありインデックス) ・属性い(短テキスト、重複ありインデックス) ) テーブルB( ・コード(短テキスト、主KEY) ・属性う(短テキスト、重複ありインデックス) ・属性え(数値、重複ありインデックス) ) 【件数】 テーブルA:15万件 テーブルB:500件 =====SQLここから===== SELECT * FROM テーブルA LEFT JOIN テーブルB ON テーブルA.コード = テーブルB.コード WHERE 属性あ IS NULL AND 属性い = 'あああ' AND 属性う = 'アアア' AND 属性え = 1 GROUP BY 年月日、 属性う =====SQLここまで===== この検索SQLは遅い(1分30秒くらい)のですが 『AND 属性う = 'アアア'』を削除すると 10秒くらいに速くなります。 ”属性う” のインデックスが効いてないように見えるのですが どのようにチューニングしたら速くなるでしょうか? エクセルからLAN越しにDAO接続してSQL実行してます。 AccessはOffice365(バージョン1902)です。