mysqlでのSQLについてアドバイスをいただきたく、投稿しました。
以下のようなDBレコードが、現在、120,000件程存在します。
id | this_key | ref_key | created_at |
---|---|---|---|
1 | AAA | 2017-07-21 | |
2 | BBB | ZZZ,AAA | 2017-07-22 |
3 | CCC | AAA | 2017-07-23 |
4 | DDD | BBB | 2017-07-24 |
以下、クリエイト文です。
create table ( id BIGINT AUTO_INCREMENT, this_key TEXT, ref_key TEXT, created_at datetime, INDEX( id, this_key(150), ref_key(150), created_at ) )
ref_key に含まれる文字列を this_key で参照し、レコードの相関表を出力する次のようなSQLを流しました。
select A.id, min(B.id) from hoge as A left join hoge as B on ( B.ref_key like concat( '%', A.this_key , '%' ) and B.created_at >= A.created_at ) group by A.id order by A.id;
想定される出力結果は次のとおりです。
A.id | B.id |
---|---|
1 | 2 |
2 | 4 |
3 | NULL |
4 | NULL |
が、レコード件数増加にともない、このSQL文が処理が終わらず、戻ってこなくなりました。
(数時間たっても反応が無い状態です)
レコード数が1000件前後だったころは、問題もなく処理できていたのですが、
増加に伴いレスポンスが著しく低下してきている現状です。
ref_key に対する like演算子の影響で indexは機能していない状態なのですが、
速度の改善がみられるようなSQL文の記述方法、別のアプローチなどあれば、アドバイスいただけないでしょうか?
どうぞ、よろしくお願い申し上げます。
回答3件
あなたの回答
tips
プレビュー