【问题标题】:Timeout on Large MySQL Query大型 MySQL 查询超时
【发布时间】:2011-02-18 08:52:39
【问题描述】:

我有这个代码:

$theQuery = mysql_query("SELECT phrase, date from wordList WHERE group='nouns'");
while($getWords=mysql_fetch_array($theQuery)) {
 echo "$getWords[phrase] created on $getWords[date]<br>";
}

查询有 75,000 个结果,每次运行代码都会出错。

【问题讨论】:

  • 您能发布您收到的确切错误吗?

标签: php mysql while-loop


【解决方案1】:

这里可能存在几个问题,所有这些都是由于您的 php.ini 中的设置造成的。您的脚本可能会超时,因为 PHP 默认为脚本执行最长 30 秒。另一个原因(同样可能)是您达到了脚本内存限制,该限制默认为每个脚本执行 8MB。

打开 php.ini 并搜索“资源限制”并进行适当的修改。

【讨论】:

    【解决方案2】:

    作为一种猜测,我会说您在 MySQL 查询上超时而不是回显结果(来自您的标题)

    您是否尝试过在 MySQL 表的 group 列上设置索引?这会减慢您的插入速度,应该会对选择产生巨大影响。

    http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

    【讨论】:

    • 我不确定您是否可以安全地假设添加索引会对选择产生影响。他说他正在取回 75K 行,但没有说明表中有多少行。如果只有 76K 行,我怀疑他会看到任何改进。如果有 300K 行,也许 . . .
    • MJB:我相信他会看到任何一种方式的改进,因为它是一个“组”语句,如果我没记错的话,拥有该索引会改进组逻辑。但是你说得对,更大的桌子会有更多的改进。
    【解决方案3】:

    php.ini 是一个很好的第一步,但您可能会发现自己在服务器上无法将这些设置更改为可以工作的设置。在这种情况下,将你正在做的事情分成几块可能是有意义的。

    例如,如果这是为了输出,您可以使用 LIMIT 一次运行 25,000 个结果。将输出粘贴到文件中,然后将文件用于输出。如果您需要输出保持新鲜,您可以每晚/小时/任何使用 cron 作业更新文件一次。

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多