2010-04-28 85 views
3

我有這個LAMP應用程序在MySQL中約有900k行,我有一些性能問題。背景 - 除了LAMP堆棧之外,還有一個在其自己的JVM中運行的Java進程(多線程)。因此,與Java的LAMP &一起,它們形成了完整的解決方案。 java進程負責插入/更新和少量選擇。這些插入/更新通常是批量/批量,5-150行之間。 PHP前端代碼只能用於SELECT。MySQL的性能

問題 - 當java進程運行時,PHP/SELECT查詢變得非常慢。當java進程停止時,SELECT的執行情況正常。我的意思是性能差異很大。當java進程正在運行時,在php前端執行的任何操作都會導致mysqld進程的80%以上的CPU使用率。

任何幫助,將不勝感激。

MySQL正在使用默認參數&設置運行。

軟件堆棧 -

  • 阿帕奇 - 2.2.x的
  • MySQL的-5.1.37-1ubuntu5
  • PHP - 5.2.10
  • Java的 - 1.6.0_15
  • 操作系統 - Ubuntu的9.10(karmic)
+0

難道我們能看到選擇/ DB結構,看是否有簡單的東西,你可能錯過了什麼? – 2010-04-28 20:00:40

+1

表結構?插入查詢導致問題的SQL是什麼?什麼是運行緩慢的選擇的SQL?你有什麼指數? – 2010-04-28 20:02:01

回答

0

我們需要知道更多關於系統的信息,以說明這是否正常或如何解決問題。

約900K排在MySQL

我要說的是,使得它非常小 - 所以,如果它的差強人意,那麼你要去嚴重錯誤的地方。

啓用查詢日誌以確切查看正在運行的查詢,根據頻率和持續時間的乘積確定優先級。看看解釋計劃,創建一些索引。考慮將數據庫分割到多個磁盤上。

HTH

C.

4

您使用的是什麼引擎?這裏需要注意的是,如果你使用的是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嘗試。您是否嘗試過使用單個線程運行進程?我想知道如果也許它可能是你發送相同的行更新到多個線程和/或你跨線程更新的方式導致鎖定問題。

以外的是,我會檢查以下內容:

  1. 你檢查你的解釋計劃,以驗證您有合理的成本和查詢實際使用你的指標?
  2. 您的表是否正常化?更具體地說,如果表可以更新單個記錄,是否更新100行?
  3. 當Java進程正在運行並且計算機正在忙於交換物料時,是否有可能耗盡物理內存?
  4. 你的磁盤(單個磁盤?)溢出的IOP比它能合理處理的多嗎?
+0

是的,我正在使用MyISAM。那麼考慮到我的情況,建議轉向InnoDB? – kapso 2010-04-28 20:39:56

+0

我試着InnoDB,得到相同的行爲:( – kapso 2010-04-29 08:43:19

+0

什麼讓我感到困惑的是,當java進程(inserts/updates)沒有運行時,數據庫真的很快,並且一旦java進程啓動,mysql就開始爬行。 – kapso 2010-04-29 08:50:17