首先,我道歉,如果已经提出这个问题,我至少找不到任何东西。
无论如何,我每隔5分钟就要完成一次cron任务。该脚本加载了79个外部页面,而每个页面包含我需要在数据库中检查的约200个值(总共15000个值)。如果它们存在于数据库中,将检查100%的值,如果它们存在(例如10%),我将使用UPDATE查询。
这两个查询都是非常基本的,没有INNER等。这是我第一次使用cron而我已经假设我会得到回复而且#34;不要使用cron该"但我的主人不允许守护进程。
查询如下:
SELECT `id`, `date` FROM `users` WHERE `name` = xxx
如果匹配,它将使用UPDATE查询(有时带有其他值)。
问题是,这会超载我的mysql服务器吗?如果是,建议的方法是什么?如果重要,我会使用PHP。
答案 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脚本。