0

まず、これがすでに尋ねられている場合は申し訳ありませんが、少なくとも何も見つかりませんでした。

とにかく、5 分ごとに cron タスクを実行します。スクリプトは 79 の外部ページをロードしますが、各ページには、データベースでチェックする必要がある約 200 の値が含まれています (合計で、15000 の値とします)。値がデータベースに存在する場合は 100% がチェックされ、存在する場合 (たとえば 10% 存在する場合)、UPDATE クエリを使用します。

両方のクエリは非常に基本的なもので、INNER などはありません。cron を使用するのは初めてで、「そのために cron を使用しないでください」という応答が返されると既に想定していますが、私のホストはデーモンを許可していません。

クエリは次のようになります。

SELECT `id`, `date` FROM `users` WHERE `name` = xxx

一致した場合は、UPDATE クエリが使用されます (場合によっては追加の値が使用されます)。

問題は、これにより mysql サーバーが過負荷になるかどうかです。はいの場合、推奨される方法は何ですか? それが問題なら、私はPHPを使用しています。

4

2 に答える 2

2

同じクエリを何度もチェックしている場合は、いくつかのオプションがあります。私の頭のてっぺんから、あなたは使うことができますWHERE name IN ('xxx','yyy','zzz','aaa','bbb'...etc)。それ以外に、別のテーブルにファイルをインポートし、1つのクエリを実行して挿入/更新を実行することもできます。

アップデート:

//This is what I'm assuming your data looks like after loading/parsing all the pages.
//if not, it should be similar.
$data = array(
    'server 1'=>array('aaa','bbb','ccc'),
    'server 2'=>array('xxx','yyy','zzz'),
    'server 3'=>array('111','222', '333'));
//where the key is the name of the server and the value is an array of names.

//I suggest using a transaction for this.
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
//update online to 0 for all. This is why you need transactions. You will set online=1
//for all online below.
mysql_query("UPDATE `table` SET `online`=0");
foreach($data as $serverName=>$names){
    $sql = "UPDATE `table` SET `online`=1,`server`='{$serverName}' WHERE `name` IN ('".implode("','", $names)."')";
    $result = mysql_query($sql);
    //if the query failed, rollback all changes
    if(!$result){
        mysql_query("ROLLBACK");
        die("Mysql error with query: $sql");
    }
}
mysql_query("COMMIT");
于 2013-03-05T19:03:08.027 に答える
0

MySQL と多くのクエリについて

このサーバーで十分な権限を持っている場合は、クエリ キャッシュを増やしてみてください。

SQL または mysql 構成ファイルで実行できます。

http://dev.mysql.com/doc/refman/5.1/en/query-cache-configuration.html

 mysql> SET GLOBAL query_cache_size = 1000000;
 Query OK, 0 rows affected (0.04 sec)

 mysql> SHOW VARIABLES LIKE 'query_cache_size';
 +------------------+--------+
 | Variable_name    | Value  |
 +------------------+--------+
 | query_cache_size | 999424 |
 +------------------+--------+
 1 row in set (0.00 sec)

MySQL のタスク スケジューラ

更新がデータベースに保存されたデータに対してのみ機能する場合 (PHP 変数がない場合) EVENT、PHP から SQL スクリプトを実行する代わりに、MySQL での使用を検討してください。

于 2013-03-05T20:36:43.417 に答える