• 締切済み

mysql_fetch_array の速度について

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

みんなの回答

  • yosakun
  • ベストアンサー率30% (3/10)
回答No.3

>index は作られて降りませんでしたが、phpMyAdmin で同じSQLをたたくと早くて、phpにすると遅いのがイマイチ理解が出来ません。よろしくお願いします。 それはよく分かりませんが この場合pathにindexを作ると劇的に改善されると思います。

参考URL:
http://www.cgis.biz/mysql/12.htm
hamatech
質問者

補足

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

  • yosakun
  • ベストアンサー率30% (3/10)
回答No.2

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

hamatech
質問者

補足

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

回答No.1

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万とかあると結構時間かかりそうです。

hamatech
質問者

お礼

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

hamatech
質問者

補足

すみません、説明が不足しておりました。 dateカラムに日付を入れておりまして、過去7日間のログを集計しており、pathカラムにあるアクセスのあった絶対パスのURL前方一致検索して、カウントさせております。 結果は、 /index.php?id=9024 (2537) /index.php?id=9005 (2488) /index.php?id=9023 (2437) という形で上位3件を表示できます。 頂いたコードを当てはめて確認してみたいと思います。

関連するQ&A

専門家に質問してみよう