2011-10-12 121 views
3

我有一個擁有500萬行的站點和數據庫,它的工作方式就像一個魅力。但是,我每小時運行一次清理cronjob,將舊數據放到「日誌」表中並刪除舊數據,此時服務器響應非常緩慢。是否有可能通過PHP或MySQL將這項工作放在較低的優先級上?PHP或MySQL中的低優先級請求

+0

它是什麼類型的數據庫? MyIsam,InnoDB等... – ashurexm

+0

數據庫是MyISAM –

回答

5

我想在您的清理最重的任務是DELETE操作,您可以使用LOW_PRIORITY。

從MySQL manual page

DELETE語法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name ...

和描述:

如果你指定LOW_PRIORITY,服務器延遲DELETE的執行,直到沒有其他r客戶正在從表中讀取。這隻影響只使用表級鎖定的存儲引擎(如MyISAM,MEMORY和MERGE)。

1

之一MYSQL中的低優先級請求是INSERT DELAYED。但它只適用於INSERT,而不是UPDATE或DELETE。

編輯:我只知道DELETE也可以推遲!

+0

這是我的一個查詢:$ sql \t = \t「INSERT INTO #__bet_oddslog(id,team1,team2,league,sport,time,q1,q2)」; 。 \t \t \t \t \t $ SQL \t \t = 「SELECT a.id,a.team1,a.team2,a.league,a.sport,a.time,AVG(b.q1)作爲Q1,」; \t \t \t \t \t $ SQL \t \t = 「AVG(b.q2)作爲Q2 FROM #__bet_details作爲,#__ bet_1x2_best爲b WHERE時間<'」 日期( 'YMD H:I:S',的strtotime (「now」))。「'AND a.id = b.bet_id GROUP BY b.bet_id」;還有一個選擇,它在這種情況下工作? –

+1

不幸的是,我相信'INSET DELAYED'不適用於'INSERT ... SELECT'語句。 – EdoDodo

1

一種可能的解決方案是在從屬複製服務器上覆制舊數據。這樣,重負載完全在該奴隸箱上。在從屬設備上覆制完成後,您可以在主設備上刪除。

1

如在the documentation中所述,您可以將LOW_PRIORITY添加到您的查詢中。所以,您的查詢就會變成:

$sql = "INSERT LOW_PRIORITY INTO #__bet_oddslog (id, team1, team2, league, sport, time, q1, q2)"; $sql .= " SELECT a.id, a.team1, a.team2, a.league, a.sport, a.time, AVG(b.q1) as q1, "; $sql .= " AVG(b.q2) as q2 FROM #__bet_details as a, #__bet_1x2_best as b WHERE time<'".date('Y-m-d H:i:s', strtotime("now"))."' AND a.id=b.bet_id GROUP BY b.bet_id";