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

ただし、通過する行が2,000万以上ある場合、これはまだかなり非効率的です。この凝縮されたデータを小さなテーブル内に保持する方がよい場合があります。

于 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'

これは、あなたの方法よりもはるかに高速です。name にインデックスを付けると、さらに高速になります。

于 2012-09-30T00:43:25.097 に答える