2009-12-21 91 views
2

我在生產服務器上遇到此問題。應用程序棧是,MySQL查詢運行速度極快,5000條記錄表

  • 的Java Web應用程序在Tomcat 6.0.18
  • iBatis的數據訪問層
  • 的MySQL 5.0數據庫
  • CentOS的

該系統被部署具有虛擬服務器上大約256 MB的內存。

真正的問題:如果執行下面的查詢

查詢等,

select * from customer 

在但是10秒左右執行,

select * from customer where code like '%a%' 

執行上述查詢之後,所述系統進入無限期處理並最終迫使Tomcat重新啓動!

表統計: - 記錄數:5000 - 主鍵:代碼

同樣的查詢PHP MyAdmin圍繞4秒執行。

您是否認爲這可能是MySQL問題?任何想法來調試這個。我現在正在啓用詳細的日誌,並會不斷更新這個問題與我的研究結果,但會很感激你的數據分析的見解。

+0

這是寫在大膽的文本語句。可能是我使用了錯誤的MarkDown標籤。讓我解決這個問題 – jatanp 2009-12-21 05:37:33

+0

我明白了。我修好了它。 – Asaph 2009-12-21 05:37:54

+3

我不希望從客戶那裏選擇*'%a%'這樣的代碼要快,因爲它不可能使用索引。每個記錄都必須檢查。如果可能的話,考慮從客戶那裏選擇*代碼如'a%',因爲那樣可以使用索引。 – Asaph 2009-12-21 05:39:52

回答

0

看來你的MySQL服務器安裝不正確,需要10秒5000個記錄不應該被接受。

你如何通過java代碼訪問你的數據庫?在這種情況下,請在這裏給出高級邏輯,也許你沒有有效地重用db處理程序。

+0

我依靠ibatis來獲取記錄。其實時間包括HTTP往返時間和邏輯執行時間。如果你考慮實際的分貝時間大約4秒。讓我編輯我的問題。另外請讓我知道我應該在MySQL配置中尋找什麼。 – jatanp 2009-12-21 05:36:03

-1

您是否嘗試過創建自動增量主字段,並將代碼作爲單獨的唯一索引。

我在使用文本時遇到了問題,因爲之前在某些環境中主鍵速度非常慢。

+0

我不能那樣做。這是一個用戶輸入字段。 – jatanp 2009-12-21 06:04:07

2

我最近在我的一個生產系統中遇到了MySQL的類似問題。

作爲上面提到的評論者,問題是在文本字段上進行通配符搜索,特別是搜索中的前導%。

我們將搜索查詢的前導百分比和縮短時間減少了幾個數量級(從服務器磨削60秒+到「沒有時間」)。

替代方法是使用全文索引或Lucene等系統進行搜索。

0

搜索開始時的百分比導致表從不使用索引。 %是通配符,所以它必須經過數據庫中的每條記錄。將這一點與tomcat運行以及MySQL正在運行的事實相結合使得它變得更糟。沒有太多空間將索引放在內存中讀取。

您需要增加該框上的內存量,以便讓MySQL創建所需的內存緩存並留出足夠的空間以使查詢快速運行。

0

在這個問題中,發佈者聲明相同的查詢在PHP MyAdmin中以4秒鐘運行,所以問題不在MySql中,或者由於%而無法使用索引,但是在Tomcat或數據訪問層中。