2014-07-03 41 views
-1

我有一個MySQL服務器與許多innodb表。 我有一個背景腳本,做了很多的刪除/插入帶有一個要求:它刪除許多百萬行從表2中,然後插入許多百萬行使用來自表1的數據表2:兩個MySQL請求在同一時間 - 性能問題

INSERT INTO table 2 (date) 
SELECT date from table 1 GROUP BY date 

(該請求實際上更復雜,但是它顯示了我正在做什麼樣的請求)。同時,我將運行第二個後臺腳本,它可以執行大約一百萬次INSERT或UPDATE請求,但是分開執行(我的意思是,我執行第一個更新查詢,然後執行插入查詢等)。 ...)在表3中。

我的問題是,當一個腳本正在運行,它是快速的,就像我們說每個需要30分鐘,所以總共1h。但是,當兩個腳本同時運行時,它非常慢,就像需要5小時,而不是1小時。

所以首先,我想知道什麼會導致這種情況?是因爲IO性能? (如mysql正在寫兩個不同的表,所以它在兩者之間切換很慢?)

我該如何解決這個問題?如果我可以說,當我的第二個後臺腳本正在運行時,大的INSERT查詢已暫停,那麼這將非常棒,例如......但我找不到像這樣做的方法。

我不是MySQL管理專家。如果您需要更多信息,請告訴我!

謝謝!

+0

更多的執行意味着更多的CPU工作,大多數內存分配也在堆棧上發生,所以推送和彈出變得非常耗時。大多數人確保腳本1在腳本2完成之前完成。想象一下,開啓10個非常消耗內存的視頻遊戲,它們需要更多的時間來完成它們與內存和CPU的關係,而不是一次打開1個遊戲。你可以做一些優化,但這可能不值得。每次只需在每臺機器上運行一個腳本。 – Jonast92

+1

這是[tag:mysql]或[tag:sql-server],但不是兩者。一旦你確定了它是什麼,你應該問[dba.se] –

+0

Jonast92:如果這是來自CPU /內存,你認爲使用nice來設置我的腳本優先級可以幫助嗎?是的,這通常是我想要做的,但這並不總是可能的。這是第一個腳本(不緊急),需要5-6小時,第二個腳本(非常緊急),需要30分鐘......所以我不能總是等待...... – user3017110

回答

1

30分鐘爲百萬INSERT不快。你在date列有索引嗎? (或者你正在使用的任何列來樞軸轉動)

關於你原來的問題。如果不知道你的腳本和表結構的細節,很難說很多,但是爲什麼這些腳本可以合理快速地分開運行是因爲你正在做類似的SELECT查詢,這些查詢可能會被MySQL緩存,然後重複用於後續查詢。但是,如果您並行運行兩個查詢,那麼相應查詢的SELECT可能不會保留在緩存中(因爲有兩個併發進程始終發送新的查詢)。

您可能希望顯式禁用某些您確定只運行一次的查詢(使用SQL_NO_CACHE修飾符)並查看它是否更改任何內容。但我會首先考慮索引和表格結構,因爲30分鐘似乎非常緩慢:)例如,如果您知道您總是選擇某個特定時期(例如按月)的條目,那麼您可能還想引入按日期劃分的表格。確切的技巧取決於你的數據。

更新:另一個問題可能是您的查詢使用同一個表(表1),並且MySQL中的默認事務隔離級別爲可重複讀取afair。所以它可能是一個查詢正在等待,直到另一個查詢完成,以滿足事務隔離級別。如果您確定表1在腳本處理時未更改,則可能需要降低事務隔離級別。

+0

謝謝,實際上我所有的INSERT/UPDATE都跟着很多SELECT查詢。我的日期欄中有一個索引!我無法真正分割我的桌子。我將用SQL_NO_CACHE做一些測試,看看這是否更好! – user3017110

+0

祝你好運,考慮到你應該只對在你的腳本中運行一次的SELECT查詢使用這個修飾符。如果存在使用相同參數多次運行的查詢,則緩存結果是有意義的。還有一個可能的問題,我會將其添加到我的答案。 – Ashalynd

0

您可以使用事件調度,所以你可以設置MySQL的推出在不同時段的這個疑問,在另一個計算器相關的問題,你有如何做到這一點的〔實施例:MySQL Event Scheduler on a specific time everyday

另一件事有記住要使用解釋計劃來查看查詢速度緩慢的原因。

+0

我真的不知道en事件調度程序可以如何幫助我..我已經使用crontab,但是我的第一個請求實際上要長得多(5h),但不是非常「重要」(它不需要很快),並且第二個是非常重要的,只需要大約30分鐘... – user3017110