代码添加减慢了

时间:2009-09-11 18:37:07

标签: php mysql performance

我的客户订购了另一个脚本,但我无法弄清楚如何解决减速问题?该表有大约50,000行。

 while($stats = mysql_fetch_array($get_stats)) {
  if ($stats['ip'] == gethostbyaddr($stats['ip'])) { // new code
   $is_undef = "Yes";            // causing problems
  } else { $is_undef = "No"; }      // end new code

 echo "<tr><td>" . date("d M Y g:i a ", strtotime($stats['date'])) . "</td><td>" .
       $stats['ip'] . "</td><td>" .
          parse_url_domain($stats['ref_url']) . "</td><td>" .
             $is_undef . "</td></tr>";
 }

这是查询:

 $get_stats = mysql_query("SELECT * FROM visitors WHERE site='$_GET[site]' AND date >= '$start_date' AND date <= '$end_date' ");

6 个答案:

答案 0 :(得分:4)

我认为您可能遇到“gethostbyaddr”问题。循环超过50k次将非常慢。

此外,并不是说它与问题有关,但你可能想要考虑sql注入一点点。我希望这不是您正在运行的实际查询。如果是这样,有人可以放下你的桌子。

答案 1 :(得分:1)

我建议在之前执行此检查将每个地址添加到数据库表中(即每次查看数据时每次一次而不是50,000次!

答案 2 :(得分:0)

我猜gethostbyaddr()很慢,因为它无法找到IP地址的主机。无论如何,以下表达的目的是什么?

$stats['ip'] == gethostbyaddr($stats['ip'])

假设$stats['ip']127.0.0.1且相应的主机为localhost。因此,您需要将127.0.0.1(IP地址)与localhost(主机名)进行比较。

答案 3 :(得分:0)

来自http://php.net/gethostbyaddr的评论:

“只是想让每个人都知道,如果IP地址未在DNS中列出,gethostbyaddr()需要超过20秒才能响应。”

我会说在循环中查看这些主机名可能会让你失望。

您发送给该查询的变量也需要正确转义,否则您真的会遇到麻烦。

答案 4 :(得分:0)

DNS请求可能需要很长时间,尤其是在50k记录中。如果您的客户端要求使用主机名而不是记录的IP地址,您可能希望运行某种后台进程来缓存主机名,而不是在每次加载页面时查找它们。

此外,大多数ISP都使用ip地址块,因此您可以开始构建跟踪IP范围的表​​和ISP的主机掩码来删除DNS查找

答案 5 :(得分:0)

我认为gethostbyaddr()调用会减慢你的速度。

请参阅http://us3.php.net/manual/en/function.gethostbyaddr.php#88920