【问题标题】:MySQL server has gone away - after a mysql php loopMySQL 服务器已经消失 - 在 mysql php 循环之后
【发布时间】:2012-09-21 09:01:36
【问题描述】:

我正在对具有超过 20MM 条目的数据库进行查询,这意味着我将查询分成几个较小的查询。

问题是如果我尝试获取页面未加载的 20MM 条目并收到通知:MySQL 服务器已消失,并显示一个空白屏幕,没有标题和内容。但是,如果我获取 5MM 条目,则页面会正确加载并显示内容:

这是我的代码

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
ini_set('memory_limit', '1000M');
for($n=0; $n<20000000; $n=$n+500000){
    $m=500000;
$query = "SELECT * FROM user_likes LIMIT ". $n .",". $m; 
//echo $query;
$result = mysql_query($query) or die(mysql_error());

// craete arrays
while($row = mysql_fetch_array($result)){
    set_time_limit(0);
    $like[$row['name']]=$like[$row['name']]+1;
    if($like[$row['name']]==375) $likes375 ++; 

}


}

// print the size
echo count($like)."<br>";
echo "375: ".$likes375; 

如果有人可以帮助我,我将不胜感激。谢谢

【问题讨论】:

  • 如果您只执行没有“craete arrays”部分的查询,您还会收到超时错误吗?
  • 真的要set_time_limit 20MM次吗?
  • 如果您想获得喜欢的次数,将其作为查询的一部分而不是在 PHP 中执行不是更有效吗?当您可以向 MySQL 询问 COUNT...WHERE... 时,为什么要将所有 20MM 记录带入 PHP?
  • 我不知道在 mysql 中执行此操作...我需要按名称和 siplay 分组计数,仅当计数高于 375 时
  • 这能回答你的问题吗? Reconnecting on MySQL Server Has Gone Away

标签: php mysql


【解决方案1】:

使用下面的查询

SELECT COUNT(*) AS likes375 FROM
(
  SELECT COUNT(*) AS name_count
  FROM user_likes
  GROUP BY name 
) counted
WHERE name_count > 375

【讨论】:

  • 当使用这个appreach时我收到:Lost connection to MySQL server during quer....数据库有超过2000万行,所以可能需要太长时间并且连接被关闭
  • @DanStern 尝试为name 字段添加索引。如果可能,请使用 id 字段而不是 name 进行分组。
【解决方案2】:

这会显示计数超过 375 的所有名称:

SELECT name
FROM user_likes
GROUP BY name
HAVING COUNT(*) >= 375

如果有 20M+ 行要通过,这仍然是非常低效的;将这些压缩数据保存在一个较小的表中可能会更好。

【讨论】:

  • 这就是问题..当使用这个appreach时我收到:Lost connection to MySQL server during quer.... db有超过2000万行,所以可能需要太长时间并且连接已关闭
  • @DanStern 我想你可以使用 MySQL 命令行客户端单独测试速度,也可以使用 EXPLAIN 功能来了解如何优化它,尽管我怀疑你可以通过这种方式优化它.
【解决方案3】:

听起来您正在备份它,并且您将不得不等待它完成,并且您的 php 最大执行时间比完成查询所需的时间要短。建议是分小块做你需要做的事情。

【讨论】:

    【解决方案4】:

    您不能在 MySQL 端更有效地执行此操作吗?

    SELECT count(*) FROM user_likes where name = '375'
    

    这将比您的方法快得多。名称索引会使其更快。

    【讨论】:

    • 实际上我没有计算 name=375,我正在检查每个名称出现了多少次。如果出现超过 375 次,则计数会增加一
    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 2011-06-07
    • 2010-12-20
    • 2011-03-19
    • 2015-01-15
    • 2016-03-06
    • 2017-04-02
    相关资源
    最近更新 更多