2013-03-05 131 views
0

首先,我很抱歉,如果这已被问及,我至少找不到任何东西。很多查询 - 很慢?

无论如何,我要每5分钟运行一次cron任务。该脚本加载79个外部页面,而每个页面都包含〜200个值,我需要在数据库中检查(总计,例如15000个值)。 100%的值将被检查,如果它们存在于数据库中,并且如果它们确实存在(比如10%),我将使用UPDATE查询。

这两个查询都是非常基本的,没有INNER等。这是我第一次使用cron,我已经假设我会得到响应“不要使用cron”,但我的主机不允许守护进程。

的查询都要为:

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

,如果有一场比赛,它会使用更新查询(有时用其他值)。

问题是,这会超载我的MySQL服务器?如果是,那么建议的方法是什么?如果有问题,我使用PHP。

+0

这会超载我的mysql服务器吗? 这取决于您的服务器^^ – 2013-03-05 19:02:56

+0

15,000'select'语句和1,500''update''命令是一个相对较小的工作负载,不应该使用合理的硬件超载数据库。但是,遵循@ JonathanKuhn的建议并尝试基于集合的解决方案而不是逐步的程序化方法会是一个好主意。另外,请确保您的表格上有适当的索引。 – 2013-03-05 19:03:28

+0

哦,你正在加载的是什么“外部页面”?只是在服务器上的文件或实际连接到外部网站和下载文件/列表?如果它真的是一个外部页面,我会假设这是你会遇到更多问题的地方。 – 2013-03-05 19:05:26

回答

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"); 
+0

它不是相同的查询,查询使用从加载的网站检索到的值...“ – Colandus 2013-03-05 19:07:41

+0

”相同的查询“我的意思是具有不同值的同一个查询。除'xxx'更改外,整个查询都是相同的。加载的网站是否有多个搜索条件,您可以简单地加载到“IN”语句中? – 2013-03-05 19:09:36

+0

此外,它不会工作,因为我必须检查它们是否在数据库中,然后更新它...并且更新值可能会有所不同,具体取决于数据库结果 – Colandus 2013-03-05 19:12:40

0

关于MySQL和许多疑问

,如果你有这样的服务器上有足够的权利 - 你可以尝试增加查询缓存。

你可以在SQL或mysql配置文件中做到这一点。在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) 

任务sheduler

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

+0

任务sheduler不是一个选项,如上所述,我需要从另一个网站加载数据。有没有办法看到我的查询使用多少查询缓存? – Colandus 2013-03-05 20:50:03