我有我的數據庫中的表(實際上是幾個相關的表),即得到可以手動從不同的點,通過我們的界面操作也自動地從兩個來源在連續的基礎。定期更新可能包含大量數據,並可能導致數千次插入/更新。爲了提高我已經使用了插入/更新的性能「SET自動提交= 0」從周圍這些自動化源的更新。這導致了期望的性能改進,甚至可能超出預期。但是現在的問題是,如果自動來源重疊,或者如果進行手動更新非常頻繁的數據庫鎖起來,過了一會兒拋出一個錯誤:InnoDB的交易:鎖等待超時
鎖等待超時超標;請嘗試重新啓動交易
這甚至在自動提交,而且沒有交易一個單獨的語句被拋出,但我想這是合理的,以及它是否與交易相沖突。我已閱讀了各種建議,但不幸的是沒有理想的解決方案。我想我的選擇是:
嘗試訂購更新/上,這樣的要求在同一個數量級上的所有線程鎖並沒有僵局的表插入。不幸的是,這是不可能的,更新需要按照他們收到的順序應用。
使用LOCK TABLES系列化事務。這在理論上是可能的,但一)除了來自兩個自動源的表從系統中的多個點,包括觸發器,時間表,手動地從各種接口更新。這將是一場噩夢,以確定並保持圍繞這些地方LOCK TABLES,沒有簡單的方法來知道所有已經確定,和b)LOCK TABLES已鎖定涉及的所有表和更新/插入雖然不經常,但有時可能需要更新多個表的更新的結果,需要再次確認和維護,使它們都包含在LOCK TABLES可能被更新的所有表。
在每次更新之前使用信號量表,以便像上面的LOCK TABLES一樣實現更新的序列化,但實際上並不需要使用LOCK TABLES。這是一個改進,但仍然存在以上問題a)的LOCK TABLES。
其他建議?可以自動提交的改善效益= 0(交易)來實現,不涉及鎖定一些其他的方式?可以將innodb配置爲實際上不鎖定或鎖定更新/插入更少?
不得已的選擇可能會移動到MyISAM表。這實際上是否會通過大量的插入/更新操作實現性能改進?
謝謝
感謝您的建議,但不幸的是)不解決這個問題,除了使其不太可能發生和b)ALTER TABLE DISABLE KEYS不與InnoDB的工作。可能會提高性能的一些因素是禁用外鍵和唯一鍵,批量插入/更新是受控情況下的完整性檢查通常不會失敗並且可以容忍偶爾違反性能的性能 –