初めて自分の家と他人の家が違う、と意識した時

DBに入れたアクセスログの集計で困ったことがあります。
phpMyAdmin でSQLを作成し実行すると、1秒で済むのですがPHPにして、ブラウザからアクセスすると5分以上かかります。ちなみにアクセスログの行数は10万行ほど。
問題のPHPのコードは下記です。
--
$sql = 'SELECT path, COUNT(path)AS cnt FROM `logs` '
. ' WHERE `path` LIKE \'/news.php?id=%\' '
. ' AND TO_DAYS(NOW()) - TO_DAYS(date) <= 7'
. ' GROUP BY path '
. ' ORDER BY `cnt` DESC '
. ' LIMIT 0 , 3';

$res = mysql_query($sql,$dbh) or die(mysql_error());
while ($row = mysql_fetch_array($res)) {
echo $row[path];
echo "(".$row[$cnt].")<br>";
}

--
mysql_fetch_array のところが問題なのかなと考えております。
お分かりになる方、是非アドバイスをお願いします。

A 回答 (3件)

10万行を全て表示してるんですか?



$s = time() + microtime();
$res = mysql_query($sql,$dbh) or die(mysql_error());

$t = time() + microtime() - $s;
error_log(sprintf("Query: %.4f", $t));

while ($row = mysql_fetch_array($res)) {
echo $row[path];
echo "(".$row[$cnt].")<br>";
}
$t = time() + microtime() - $s;
error_log(sprintf("While: %.4f", $t));

こんな風にしてエラーログを出してみると、どこで時間がかかっているか解かるんじゃないですかね?
whileが10万とかあると結構時間かかりそうです。

この回答への補足

すみません、説明が不足しておりました。
dateカラムに日付を入れておりまして、過去7日間のログを集計しており、pathカラムにあるアクセスのあった絶対パスのURL前方一致検索して、カウントさせております。

結果は、
/index.php?id=9024 (2537)
/index.php?id=9005 (2488)
/index.php?id=9023 (2437)
という形で上位3件を表示できます。
頂いたコードを当てはめて確認してみたいと思います。

補足日時:2008/03/15 01:29
    • good
    • 0
この回答へのお礼

ありがとうございます、mysql_query のところで遅くなっているのがわかりました。どうやら、mysql_fetch_arrayでは無かったようです。
phpMyAdmin との速度の差について、類似した例を探してみます。

お礼日時:2008/03/16 12:18

>index は作られて降りませんでしたが、phpMyAdmin で同じSQLをたたくと早くて、phpにすると遅いのがイマイチ理解が出来ません。

よろしくお願いします。

それはよく分かりませんが
この場合pathにindexを作ると劇的に改善されると思います。

参考URL:http://www.cgis.biz/mysql/12.htm

この回答への補足

pathにindexを作成しました。
30秒ほど早く実行できましたが、まだまだ乖離があります。

補足日時:2008/03/16 09:37
    • good
    • 0

indexつけてます?


「mysql index 作成」でググると沢山でてきます

この回答への補足

このテーブルを調べたらindexがありませんでした。
ググって改善してみます、
index は作られて降りませんでしたが、phpMyAdmin で同じSQLをたたくと早くて、phpにすると遅いのがイマイチ理解が出来ません。よろしくお願いします。

補足日時:2008/03/15 01:49
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!