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). 除此之外,您可以将文件导入到另一个表中,并可能运行一个查询来进行插入/更新。

更新:

//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在 MySQL 中使用,而不是从 PHP 运行 SQL 脚本。

于 2013-03-05T20:36:43.417 回答