2011-10-19 69 views
0

我有一個Java應用程序,我想從表中獲取一些數據並顯示在應用程序中。當限制去到最後記錄mysql查詢速度慢

我有數以百萬計的記錄,並且當我正在查看最後的記錄時,查詢變得非常慢。獲得結果需要幾分鐘的時間。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000 

上述查詢返回一個快速結果。這是第一頁快速返回。但是當我移動最後一頁時,它變得很慢。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000. 

此查詢速度較慢,需時17秒。

關於如何使這個更快的任何想法? Id是table1x的主鍵。

+0

可能的重複[爲什麼MYSQL更高的LIMIT偏移減慢查詢速度?](http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-下) –

回答

1

問題在於此。要獲取前1000條記錄,數據庫只需要過濾數據庫,直到找到1000條匹配搜索的記錄。對於其他查詢,數據庫需要匹配記錄,直到它有645000條記錄,這使得它慢得多。沒有排序或其他篩選,因此ID上的索引根本沒有幫助。

description上的索引將有所幫助,但如果您使用通配符開始搜索,則不會如您現在所做的那樣。

我看到兩個解決方案。

第一個選項是在說明字段中添加一個FULLTEXT索引。它允許使用MATCH而不是LIKE查找單詞error。我認爲它會快很多,但索引也會變得更大,並且我不確定長期的優化。

第二種解決方案:既然你顯然在尋找錯誤(我認爲你在建立一個日誌表上的報告?),你可以添加一個記錄類型的列。您可以爲每條記錄提供一個類型(只是一個整數),它指示該記錄存在或不存在錯誤的位置。您需要更新表格一次,然後將該類型與新記錄一起插入,但它會使您的查詢更快。

我必須承認,第二個解決方案是基於對數據和目標的假設。如果我錯了,請提供更多信息,我可能會找到更適合您的解決方案。