0

これは私が取り組んだ最初のクエリです。クエリの処理に時間がかかりすぎました。これにより、テーブル内の何百万もの行が処理されます。

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 行が処理されます。時間があれば、さらに最適化を検討しますが、今のところ、やらなければならないことが多すぎます。

もう一度、ありがとう!

4

3 に答える 3

1

これまでに受け取ったすべての提案にはメリットがあります...

しかし、「推測」しないでください。「EXPLAIN」を実行して、mySQL が何をすべきだと考えているかを正確に確認します。これにより、クエリを最適化し、より適切に実行する方法を理解できます。

ここにいくつかの参照があります:

于 2013-10-01T19:54:17.803 に答える
0

このクエリを実行して、所要時間を教えてください。また、クエリをテストしておらず、結合クエリに基づいて作成しただけです。構文エラーがあれば修正してください。

SELECT date(a.datetime), count(*) from 
(
SELECT datetime,SESSION_ID from LOG 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'))
) as a, 
(
SELECT datetime,SESSION_ID from LOG where (code_subcode in('8008119', '8008219', '8008319', '8008419'))
) as b where b.SESSION_ID=a.SESSION_ID and 
date(a.datetime) = date(b.datetime) and TIMEDIFF(b.datetime, a.datetime) < 1)
GROUP BY DATE(a.datetime)
ORDER BY DATE(a.datetime);

また、インデックスを使用し、日付と時刻を別々の列に保存して、翻訳コストを最小限に抑えてください。

次のコードを使用してプロファイリングします

set profiling=1;
//run your query
show profile;

出力を教えてください。ありがとうございました

于 2013-10-01T20:30:31.607 に答える