2017-01-05 65 views
1

當我運行每隔一小時更新的全球遊戲狀態下的cron過程:MySQL的「堆積」導入行

  • 創建臨時表
  • 對於每個統計,行插入到臨時表(STAT鍵,用戶,得分,秩)
  • 截斷主統計表
  • 到主表

的升

  • 從臨時表複製數據ast步驟會導致查詢中出現大量積壓。查看SHOW PROCESSLIST我看到一堆updating狀態查詢被卡住,直到複製完成(可能需要一分鐘)。

    但是我注意到它並不像它有連續的查詢ID堆積起來,許多查詢都完成得很好。所以它幾乎看起來像是一個「線程」被卡住了或什麼東西。另外值得注意的是,該卡的更新沒有任何共同之處與正在進行的副本(不同的表等)

    所以:

    • 我能有cron的連接到MySQL上的專用「線​​程」,使得其磁盤活動(或任何它)不鎖定其他更新,或者我是否誤解了正在發生的事情,如果是的話,我怎麼能找出實際的情況是什麼?

    讓我知道你是否需要任何更多的信息。

  • +0

    卡住的進程說他們在等待什麼? – Barmar

    回答

    1

    MySQL線程並沒有完全命名。例如,如果您是Java開發人員,則可能會根據您的Java知識對MySQL線程做出一些不真實的假設。

    由於某些原因很難從遠處診斷,您的複製步驟阻止了一些查詢的完成。如果您好奇哪些人試着做

    SHOW FULL PROCESSLIST 
    

    並嘗試使結果有意義。

    與此同時,您可能會考慮採用稍微不同的方法來刷新這些小時統計。

    1. 創建一個新的,非臨時表,稱它像stats_11爲上午11點更新。如果具有該名稱的表已經存在,首先刪除舊的。
    2. 根據需要填充該表。
    3. 添加它需要的索引。有時,如果在執行索引時沒有到位,填充表格會更快。
    4. create or replace view stats as select * from stats_11

    下一個小時,做同樣的stats_12。這個想法是讓你的stats視圖幾乎總是指向一個有效的統計表。

    這應該你的曝光時間縮短到統計表建設operaiton。

    +0

    這很有趣。因此,建立一個給定的小時表,並更新視圖到它......這將如何與外鍵引用用戶ID等? –

    +0

    之前:1分鐘。之後:<5ms。是的,我認爲解決了它。 –

    0

    如果任務是完全重建表,這是最好的:

    CREATE TABLE new_stats LIKE stats; 
    ... fill up new_stats by whatever means ... 
    RENAME TABLE stats TO old_stats, new_stats TO stats; 
    DROP TABLE old_stats; 
    

    有零干擾,因爲表real始終可用,始終擁有一套完整的行。 (OK,RENAME確實需要時間微不足道的金額。)

    沒有意見,沒有臨時表,沒有複製數據上,不需要24桌。

    你可以考慮「持續」完成任務,而不是每小時完成一次。如果表格變得如此之大以至於每小時cron作業需要一個多小時,這將變得特別有益!