ポッドキャストの MP3 ファイルを提供するために Amazon S3 を使用しています。Amazon はアクセス ログを提供しており、私はこれを取得して MySQL データベースに保存しています。データベースは次のようになります。
request_id varchar(16)
time int(10)
file varchar(255)
sent bigint(20)
size bigint(20)
status smallint(5)
ip varchar(39)
referrer varchar(255)
user_agent varchar(255)
これはポッドキャストであるため、膨大な数のヒットは (iTunes/iOS からの) 206 の範囲要求であり、各ファイルを小さなチャンクで要求します。
また、ファイルを複数回ダウンロードする人もいます。
だから私がやろうとしているのは、次のようなクエリを作成することです:
- ファイルごと、IPごとに1つの結果のみを提供します(したがって、各IP /人は各ファイルに対して1つの「ヒット」としてのみカウントできます)。
- ファイル/IP ごとに送信されたすべてのバイトの合計 (
sent
列) を合計するので、その特定のファイル/IP の組み合わせに対するすべての範囲要求の合計が何であるかがわかります。 - ボーナス: ファイル/IP ごとの列の合計を比較し、
sent
バイトの合計がsize
列の 75% 以上である場合にのみその結果を返します (現在、この比較は PHP でクエリ後に行っています)。
これは私が現在使用しているもので、機能していると信じていますが、完全な影響はGROUP BY
私にとって謎です(たとえば、列の順序はGROUP BY
重要ですか?):
SELECT FROM_UNIXTIME(time,'%M %D') as date, ip, file, SUM(sent) as sent, size
FROM stats
WHERE sent > 0
AND size > 0
AND FROM_UNIXTIME(time, '%Y-%m-%d') >= '2012-09-01'
AND FROM_UNIXTIME(time, '%Y-%m-%d') <= '2012-09-30'
GROUP BY ip, file
ORDER BY time ASC, file ASC
ここで潜在的な落とし穴を見た人はいますか?