2013-03-05 312 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