很多疑问 - 慢?

时间:2013-03-05 18:58:06

标签: php mysql cron

首先,我道歉,如果已经提出这个问题,我至少找不到任何东西。

无论如何,我每隔5分钟就要完成一次cron任务。该脚本加载了79个外部页面,而每个页面包含我需要在数据库中检查的约200个值(总共15000个值)。如果它们存在于数据库中,将检查100%的值,如果它们存在(例如10%),我将使用UPDATE查询。

这两个查询都是非常基本的,没有INNER等。这是我第一次使用cron而我已经假设我会得到回复而且#34;不要使用cron该"但我的主人不允许守护进程。

查询如下:

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

如果匹配,它将使用UPDATE查询(有时带有其他值)。

问题是,这会超载我的mysql服务器吗?如果是,建议的方法是什么?如果重要,我会使用PHP。

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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中的任务sheduler

如果您的更新可能仅适用于存储在数据库中的数据(没有PHP变量) - 请考虑在MySQL中使用EVENT,而不是从PHP运行SQL脚本。