これは私が取り組んだ最初のクエリです。クエリの処理に時間がかかりすぎました。これにより、テーブル内の何百万もの行が処理されます。
select date(datetime), count(*) from LOG l1
where ((datetime >= str_to_date('2013-01-01 00:00:00','%Y-%m-%d %H:%i:%s'))
and (datetime < str_to_date('2013-01-30 00:00:00','%Y-%m-%d %H:%i:%s'))
and code_subcode in ('8008118', '8008218', '8008318', '8008418'))
and (
select count(*) from log l2
where l2.session_id = l1.session_id and l2.remote_ip = l1.remote_ip and code_subcode
in('8008119', '8008219', '8008319', '8008419')
and TIMEDIFF(l2.datetime, l1.datetime) < 1)
group by date(datetime) order by date(datetime);
少し読んだ後、結合はネストされた選択よりも高速であることがわかったので、これに変換しました...
SELECT date(l1.datetime), count(*) from LOG l1
INNER JOIN LOG l2 ON l2.SESSION_ID=l1.SESSION_ID
where ((l1.datetime >= str_to_date('2013-01-01 00:00:00','%Y-%m-%d %H:%i:%s'))
and (l1.datetime < str_to_date('2013-01-30 00:00:00','%Y-%m-%d %H:%i:%s'))
and l1.code_subcode in ('8008118', '8008218', '8008318', '8008418')
and l2.code_subcode in('8008119', '8008219', '8008319', '8008419')
and date(l1.datetime) = date(l2.datetime)
and TIMEDIFF(l2.datetime, l1.datetime) < 1)
GROUP BY date(l1.datetime)
ORDER BY DATE(l1.datetime);
助けてください、ありがとう。
ご協力ありがとうございました。実行に時間がかかるのは、プログラムがサーバー上で黙って失敗しているためであることが判明しました。私のローカル環境でクエリを実行すると、48 秒で 800,000 行が処理されます。時間があれば、さらに最適化を検討しますが、今のところ、やらなければならないことが多すぎます。
もう一度、ありがとう!