2016-04-25 63 views
0

我們有30-40個不同的Python和PHP項目,每天更新,插入和選擇超過100萬行MySQL數據行。MySQL查詢等待其他查詢完成

目前我們在表中使用InnoDB Engine。

問題:當幾乎所有項目都在工作並且大量查詢在數據庫中處理時,我們在MySQL中出現了高峯。主要查詢對於完成ASAP(高優先級)以及可以等待主查詢完成(優先級較低)的查詢非常重要。 但是,當它們進入MySQL併發時,它會導致主查詢等待優先級較低的查詢結束。

問題:

  1. 是否有可能執行主查詢(這樣他們就可以儘快完成)之前釋放在表中的所有的鎖?或者如果它幫助創建鎖定?

  2. 當我們自動啓動執行主查詢時,我們可以暫停優先級較低的查詢執行嗎?

  3. 在查詢中可以使用HIGH_PRIORITY和LOW_PRIORITY嗎?

  4. 在MySQL中有一些配置可以提供幫助嗎?

  5. 可以將表更改爲MyISAM或其他數據庫引擎的幫助嗎?

讓我知道你的想法和想法。

+0

這是一個服務器優化的問題,你可能有更多的運氣比[DBA的網站(http://dba.stackexchange.com),因爲它可能涉及到服務器配置而不是應用程序代碼。無論你的問題MyISAM不是你的答案。 – tadman

+1

請向我們展示一些高峯期的查詢,以及'SHOW CREATE TABLE'。 –

回答

1
  1. 不可以。您可以嘗試升級到MySQL 5.7,因爲如果事務不會相互干擾,它允許在表內並行複製。
  2. 請參閱http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html關於低優先級如何不起作用。
  3. 參見#2。
  4. 在你的應用程序中查看你如何鎖定你的鎖定可能會更好 - - 你是否鎖定了行,進行了更改,快速解鎖或者代碼是否以一種悠閒的方式來執行此操作?
  5. MyISAM在表級鎖定而不是行級別,MyISAM不支持事務(這可能是您鎖定記錄的原因)。
0

在沒有鎖定查詢的情況下很難給出確定的答案。 如果你可以添加它們會更有用。 有幾件事你可以看看: 尋找鎖定語句,例如「select for update」,「insert on conflict update」等等...... -many times最好在應用程序端捕獲異常,然後讓db執行加班。

讀取併發性:它可能是「讀取已提交」對您來說已經足夠了,並且它會佔用更少的鎖。

如果您根據使用情況具有複製專用實例(例如,關鍵只服務器)

問候 強尼