MYSQL / PHP无法保存结果集

时间:2011-04-17 03:34:14

标签: php mysql

我正在运行一个PHP脚本,它基本上试图从MYSQL数据库中找到匹配的名称,然后将相同的号码分配给名称相同的记录。

我的问题是记录数量约为150万。该脚本每次总是运行大约14个小时并发出此错误:mysql_query无法在xx行xxx上保存结果集。和phpmyadmin给出了这个错误#2008 in memeory

这是我的PHP代码

mysql_query("SET SQL_BIG_TABLES=1");

$res = mysql_query("SELECT company_name, country, id FROM proj")
       or die (mysql_error());

while ($row = mysql_fetch_array($res, MYSQL_NUM)) {
    $res1 = mysql_query("SELECT company_name, id FROM proj WHERE country='$row[1]'"+
          "AND id<>'$row[2]'") or die ("here".mysql_error().mysql_errno());

    while ($row1 = mysql_fetch_array($res1, MYSQL_NUM)) {
          //My calculations here 
    }
}

1 个答案:

答案 0 :(得分:5)

确定。您的查询非常低效。你在评论中说有150万行。

  1. 外部查询创建一个包含所有150万行的结果集
  2. 内部查询创建一个包含所有150万行的新结果集,除了与您循环的行相同的行。所以基本上你做了150万*(150万-1)行= 2,249,998,500,000 = 2.25万亿行
  3. 换句话说,不仅效率极低 - 这绝对是荒谬的。鉴于您似乎只想按国家/地区获取行,为什么不执行以下操作:

    $sql1 = "SELECT DISTINCT country FROM proj";
    $res1 = mysql_query($sql1) or die(mysql_error());
    
    while($row1 = mysql_fetch_associ($res1)) {
        $country = $row1['country'];
        $escaped_country = mysql_real_escape_string($country);
        $sql2 = "SELECT company_name, id FROM proj WHERE country='$country'";
        $res2 = mysql_query($sql2) or die(mysql_error());
        while ($row2 = mysql_fetch_assoc($res2)) {
           ... calculations ...
        }
    }
    

    这只能从数据库中获取150万条+国家记录,远远低于您的版本2.3万亿。