簡體   English   中英

MySQL之類的查詢對於5000條記錄表的運行極其緩慢

[英]MySQL like query runs extremly slow for 5000 records table

我的生產服務器上有這個問題。 應用程序堆棧是,

  • Tomcat 6.0.18上的Java Web App
  • iBatis數據訪問層
  • MySQL 5.0數據庫
  • CentOS的

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

實際問題:

查詢像

select * from customer

在大約10秒內執行,但是如果執行以下查詢,

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

在執行上述查詢后,系統立即進入不確定處理,並最終迫使Tomcat重新啟動!。

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

同一查詢PHP MyAdmin大約在4秒鍾內執行。

您認為這可能是MySQL問題嗎? 任何想法來調試它。 我現在正在啟用詳細的日志,並將根據我的發現繼續更新此問題,但將感謝您對數據庫的見解。

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

正如上面的評論者所述,問題是在文本字段上進行通配符搜索,尤其是搜索中的前導%。

我們降低了前導的%並將搜索查詢所花費的時間減少了幾個數量級(從服務器耗時60秒以上到“根本沒有時間”)。

替代方法是使用全文索引或像Lucene這樣的系統進行搜索。

看來您的MySQL服務器設置不正確,花費10秒讀取5000條記錄應該是不可接受的。

您如何通過Java代碼訪問數據庫? 在這種情況下,請在此處提供高級邏輯,也許您沒有有效地重用db處理程序。

搜索開始時的%導致表從不使用索引。 %是通配符,因此它必須遍歷數據庫中的每個記錄。 再加上tomcat和MySQL都在運行,這使情況變得更糟。 沒有很多空間可以在內存中讀取索引。

您需要在該框上增加內存量,以使MySQL創建所需的必要內存緩存,並為允許查詢快速運行提供空間。

在問題中,發帖人指出,同一查詢在PHP MyAdmin中將在4秒鍾內運行,因此問題不在於MySql或由於%而導致無法使用索引,而是在Tomcat或數據訪問層中。

您是否嘗試過創建自動遞增的主字段,並使代碼成為單獨的唯一索引。

以前,在某些環境中,文本作為主鍵的速度非常慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM