您使用的是什麼引擎?這裏需要注意的是,如果你使用的是MyISAM,那麼由於引擎使用表鎖,你將會遇到鎖定問題。
來源:MySQL Table Locking
表鎖也是不利的 以下情形下:
* A session issues a SELECT that takes a long time to run.
* Another session then issues an UPDATE on the same table. This session
waits until the SELECT is finished.
* Another session issues another SELECT statement on the same table.
Because UPDATE has higher priority than SELECT, this SELECT waits for the UPDATE to finish,
after waiting for the first SELECT to finish.
這裏我就不再贅述,但頁面上有提高併發的一些技巧在MySQL中的一張桌子上。顯然,一種選擇是改用像InnoDB這樣的引擎,它具有更復雜的行鎖定機制,因爲高併發性表可以使性能發生巨大差異。有關InnoDB的更多信息,請轉至here。 在更改引擎之前,儘管可能需要查看其他提示,例如確保表格已正確索引等,因爲無論存儲引擎如何,這都會提高選擇和更新性能。
編輯根據用戶評論:
我會說這是根據你所描述的症狀之一可能的解決方案,但它可能不是 的一個,你想,將讓你。沒有更多的信息是不可能的。 由於缺乏索引,您可能正在進行全表掃描。這可能會導致磁盤上的I/O爭用 ,這會進一步損害MyISAM使用的表鎖。如果是這種情況,那麼 原因的根源是不正確的索引和糾正,這將是您更改存儲引擎之前的最佳行動方案 。
此外,請確保您的表格已標準化。這可能對性能 尤其是在更新上產生深遠的影響。標準化的表格可以允許您在非標準化表格中更新單個行而不是數百個或者數千個 。這是由於不重複的價值。它還可以在選擇時節省大量的I/O ,因爲數據庫可以更高效地緩存數據塊。在不知道 的結構的情況下,您正在使用的表格或您提供的索引很難爲您提供更詳細的響應。
你提到你的Java程序是多線程:用戶後
編輯使用的是InnoDB嘗試。您是否嘗試過使用單個線程運行進程?我想知道如果也許它可能是你發送相同的行更新到多個線程和/或你跨線程更新的方式導致鎖定問題。
以外的是,我會檢查以下內容:
- 你檢查你的解釋計劃,以驗證您有合理的成本和查詢實際使用你的指標?
- 您的表是否正常化?更具體地說,如果表可以更新單個記錄,是否更新100行?
- 當Java進程正在運行並且計算機正在忙於交換物料時,是否有可能耗盡物理內存?
- 你的磁盤(單個磁盤?)溢出的IOP比它能合理處理的多嗎?
難道我們能看到選擇/ DB結構,看是否有簡單的東西,你可能錯過了什麼? – 2010-04-28 20:00:40
表結構?插入查詢導致問題的SQL是什麼?什麼是運行緩慢的選擇的SQL?你有什麼指數? – 2010-04-28 20:02:01