0

我正在对具有超过 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; 

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

4

4 回答 4

1

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

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

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

于 2012-09-30T04:20:29.900 回答
1

使用以下查询

SELECT COUNT(*) AS likes375 FROM
(
  SELECT COUNT(*) AS name_count
  FROM user_likes
  GROUP BY name 
) counted
WHERE name_count > 375
于 2012-09-30T03:45:01.287 回答
0

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

于 2012-09-30T00:17:32.053 回答
0

难道你不能在 MySQL 方面更有效地做到这一点吗?

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

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

于 2012-09-30T00:43:25.097 回答