2013-07-13 44 views
0

我們需要每24小時運行一次腳本,計算總和&從1個大日誌表中刪除數據,並更新Main_Table(Innodb)中的數據,該數據有多個select/update查詢時間(大約每秒1次)數據鎖定阻止查詢運行 - MySQL InnoDB

我跑一個地方DB歷時約10分鐘測試查詢:

Update Main_Table Set Steps = (Select count(*) From Log_Activity Where Log_Activity.MainID = Main_Table.ID) 

而且因爲這會更新MAIN_TABLE一切所有的行會卡在現場項目,因爲表loacking我猜 - 我必須殺死查詢的過程才能開始正常工作再次 - 沒有數據更新。

我做了一些挖掘和我正在考慮以下3個選項:在臨時表

  1. 更新的所有數據,然後合併到MAIN_TABLE莫名其妙。
  2. 在php循環中運行腳本而不是1次MySql查詢(將花費更多的時間,但每次更新1行)。
  3. 我不確定這是否與我們的問題有關,但我讀了 關於「START TRANSACTION ... etc」的一些信息,我認爲這可能與 有關......是嗎?

希望有人能夠對此有所瞭解並幫助我們。 感謝

回答

0
  1. Log_Activity.MainID創建索引,如果不存在:

    ALTER TABLE Log_Activity ADD INDEX (MainID); 
    
  2. Main_Table.ID創建索引,如果不存在:

    ALTER TABLE Main_Table ADD INDEX (ID); 
    
  3. 重寫查詢以使用連接,而不是相關的子查詢:

    UPDATE Main_Table JOIN (
        SELECT MainID ID, COUNT(*) c 
        FROM  Log_Activity 
        GROUP BY MainID 
    ) t USING (ID) 
    SET Main_Table.Steps = t.c; 
    
+0

Thanks eggyal!不過,我寧願不爲Log_Activity.MainID創建一個索引,因爲這個表每分鐘(有時每秒)獲取很多插入,並且這個預期會增長..)其他想法? – SiteAppDev