2013-03-22 37 views
1

當我測試此查詢時,大約需要17-20秒才能完成。可以使用多長時間運行mySQL查詢

UPDATE ex_hotel_temp 
SET specialoffer='1' 
WHERE hid IN 
    (SELECT hid 
    FROM ex_dates 
    WHERE offer_id IS NOT NULL 
     OR xfory_id IS NOT NULL 
     OR long_id IS NOT NULL 
     OR early_id IS NOT NULL 
    GROUP BY hid) 

雖然這是在夜間運行做數據庫的一些看家一個cronjob(沒有站點訪問者坐着等待結果),在我看來是服務器上的負載不能接受。我是對的嗎,還是我無所事事?

當我單獨運行查詢的每個元素大約需要0.001秒。我是否應該將它分解爲一系列簡單的查詢呢?

後來編輯: 在收到的意見和答案的幫助下,我決定將查詢分成兩部分。結果是這樣的:

$query_hotel = "SELECT hid FROM ex_dates WHERE offer_id IS NOT NULL OR xfory_id IS NOT NULL OR long_id IS NOT NULL OR early_id IS NOT NULL GROUP BY hid"; 
$hotel = mysql_query($query_hotel, $MySQL_XXX) or die(mysql_error()); 
$row_hotel = mysql_fetch_assoc($hotel); 
$totalRows_hotel = mysql_num_rows($hotel); 

$hid_array = array(); 
do { 
    array_push($hid_array,$row_hotel['hid']); 
}while ($row_hotel = mysql_fetch_assoc($hotel)) ; 
$hid_list = implode("','",$hid_array); 
$hid_list = "'$hid_list'"; 

// Mark the hotels as having a special offer 
$query_update = "UPDATE ex_hotel_temp SET specialoffer='1' WHERE hid IN ($hid_list)"; 
$result = mysql_query($query_update, $MySQL_XXX) or die(mysql_error()); 

這不是很漂亮,但它的工作原理。

由於有兩個查詢引入了一點PHP,我無法準確測量運行需要多長時間,但僅僅通過查看頁面加載時間就顯得非常接近到20秒的分數。

感謝所有。

+1

我建議使用聯接,放棄'GROUP BY'(它不會在此添加任何內容),並確保'ex_hotel_temp.hid'和'ex_dates.hid'上有索引。 – eggyal 2013-03-22 11:24:31

+0

也許刪除'GROUP BY hid'並更改爲'SELECT DISTINCT hid' – Justin 2013-03-22 11:34:55

回答

0

你說這是在CRON工作中過夜,你說這支持「網站」 - 如果這是一個面向公衆的網站,是的,你應該擔心。

有沒有這樣的事情在互聯網上營業時間 - 將有遊客與您的網站互動,希望嘗試購買的東西,在一天的所有時間;即使是「國家」的網站,我也可以看到夜間的交通情況(儘管與高峯時段相比通常只有很小的一部分)。

您的CRON作業可能導致其他查詢也運行緩慢 - 這取決於導致查詢運行緩慢的原因以及是否使用事務。網站的問題在於,用戶在網站速度較慢,刷新頁面時往往不耐煩,通常會爲數據庫創建更多流量,並且如果網站上存在其他慢速查詢,則網站變得不可用一段時間,即使用戶數量相當有限。

因此,如果有可能是腳本運行時您的網站用戶,它絕對值得整理。

您可能擔心的另一個原因是,根據我的經驗,數據庫性能不是線性的 - 查詢不會與表中的記錄數成線性比例減慢。相反,他們傾向於像曲棍球棒一樣 - 一切都很好,直到你到達一個臨界點,並且一切都停滯不前。您可能會騎曲棍球曲線,並且可能會從17-20秒輕鬆升至17-20分鐘。

修復看起來很簡單 - group by是多餘的,並且將查詢拆分爲更小的查詢應該有助於子查詢使用索引。

0

我不在乎,只要確保cron作業不會在處理過程中暫停一半。 我個人曾經查詢過,然後在沒有任何問題的情況下在cron作業中運行分鐘。