- 締切済み
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 のところが問題なのかなと考えております。 お分かりになる方、是非アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yosakun
- ベストアンサー率30% (3/10)
>index は作られて降りませんでしたが、phpMyAdmin で同じSQLをたたくと早くて、phpにすると遅いのがイマイチ理解が出来ません。よろしくお願いします。 それはよく分かりませんが この場合pathにindexを作ると劇的に改善されると思います。
- yosakun
- ベストアンサー率30% (3/10)
indexつけてます? 「mysql index 作成」でググると沢山でてきます
補足
このテーブルを調べたらindexがありませんでした。 ググって改善してみます、 index は作られて降りませんでしたが、phpMyAdmin で同じSQLをたたくと早くて、phpにすると遅いのがイマイチ理解が出来ません。よろしくお願いします。
- みずの(@mizuno3)
- ベストアンサー率73% (192/263)
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万とかあると結構時間かかりそうです。
お礼
ありがとうございます、mysql_query のところで遅くなっているのがわかりました。どうやら、mysql_fetch_arrayでは無かったようです。 phpMyAdmin との速度の差について、類似した例を探してみます。
補足
すみません、説明が不足しておりました。 dateカラムに日付を入れておりまして、過去7日間のログを集計しており、pathカラムにあるアクセスのあった絶対パスのURL前方一致検索して、カウントさせております。 結果は、 /index.php?id=9024 (2537) /index.php?id=9005 (2488) /index.php?id=9023 (2437) という形で上位3件を表示できます。 頂いたコードを当てはめて確認してみたいと思います。
補足
pathにindexを作成しました。 30秒ほど早く実行できましたが、まだまだ乖離があります。