MySQLの抽出について
MySQLの抽出時間を短縮できないため困っております
productテーブル
product_id,test_id
86009,'10701,8545'
84334,'12610,9505,13326,9024,1020747,6787,3737,5266'
85078,'1001182,1002129,1003064'
84082,'24723,23417,1002357,1000683,1002258,1003501,25426'
85072,'1008167,1007194,1006309,5240,1009347,30212'
85071,'28079,1007881,1000733,1002367,27836,25141,29863'
86014,'23988,17802,26440,1005928,22668,28372,28135'
83762,'1010127,1010436,1011554,1013949,1014307'
test_masterテーブル
id,initial_kana
10701,'あ'
21122,'あ'
1002129,'あ'
1002357,'い'
2291,'い'
29863,'い'
23988,'う'
1010436,'え'
22299,'え'
上記の2つのテーブルがあります。
内容は下記のようになります。
productテーブルの
product_id:一意のID
test_id:test_masterテーブルの一意のID(test_master.id)のカンマ区切りで接続した文字列
実際のレコード数:86,688件
test_masterテーブルの
id:一意のID
initial_kana:全角一文字のみ
実際のレコード数:14,602件
【やりたいこと】
(1)test_masterテーブルのtest_master.initial_kanaカラムに対応する文字(例えば'あ')に対応するtest_master.idを取得する
(2)(1)で取得したtest_master.id群を元に、productテーブルのtest_idに
該当する(product.test_id文字列の中にtest_master.idが入っているもの)もののproduct.product_idを取得する
ということをしたいのです。
(3)例えば、test_master.initial_kana='あ'を取得したい場合、productテーブルのproduct.product_id=86009,85078が取得される
私の作ったSQLは下記のものになります
limitとoffsetに関しては、都合上消すことはできません。
・test_masterテーブルから、test_master.initial_kana='あ'のものを抽出
・productテーブルから、product.test_idがNULLでないものを抽出
・上記二つから、FIND_IN_SETで、test_master.idに該当するproduct.test_idの文字列の中から抽出
---------------------------------------------------------
select p.product_id as product_id,
am.id as id
from ( select id
from test_master
where initial_kana = 'あ' ) as am,
( select product_id,test_id
from product
where test_id is not null
) p
WHERE ( FIND_IN_SET(am.id, p.test_id)!=0 )
group by am.id
limit 20
offset 0
---------------------------------------------------------
このSQLを実行すると件数が多いためか
30秒ほど掛かってしまい実用に耐えられない状況です。
すみませんが、SQLに詳しい方がいらっしゃいましたら
ご教授をお願いできますでしょうか。
検索が5秒くらいまで短縮できれば万々歳なのですが…
よろしくお願いいたします
お礼
なるほど、この方法でいけそうですね! 勉強になりました。 ありがとうございました。