2015-04-17 30 views
0

我最近創建了一個通過rest api公開數據庫的應用程序(java 8,spring-boot,hibernate,maven)。我遇到的問題是數據庫調用很慢(3000毫秒+)只是爲了得到一行。慢SQL,需要幫助。我應該記憶嗎?

我的表看起來像這樣:大於(6M行,210MB時,InnoDB,MySQL的)

Row | Type | length 

id  | int | 10 

start | int | 10 

end | int | 10 

rec_id | int | 11 - primary key 

和我的SQL是:

WHERE start < x AND end > x 

但在Hibernate中約定:

BlocksEntity findByStartLessThanAndEndGreaterThan(int start, int end) 

其中開始和結束的值相同

我得知,這個BETWEEN(well>和< for Hibernate)可能是一個非常昂貴的操作。 所以,因爲這是如此緩慢,我開始因爲尋找到在內存中的表:

  • 我只需要從數據庫中讀取,在數據庫中幾乎沒有變化不進行更新,它
  • 數據,我們每個月都可以談一次

什麼是最好的方式來這裏?我非常需要這樣做,儘可能快速地提供響應,因爲它會將內容傳送到快速暫停的網頁。我想過緩存,但由於我將緩存在用戶端點上的結果,所以這裏的任何緩存將永遠不會被擊中。此外,密鑰(x)對於緩存來說太獨特,並且很可能不會被擊中。

還有其他表格以及我讀的,但這個是最有問題的。任何幫助和建議都將得到真正的讚賞。

+1

您有索引?你根本沒有提到這個詞...... –

+0

將表格的內容移入內存,然後在內存中對您的表執行查詢,而不是對數據庫執行查詢。這將改善性能。並且不要使用Hibernate的二級緩存,因爲它會首先查詢數據庫。 –

+0

@AlexK。不,不幸的是,桌子上沒有索引。我希望有,但不是我的數據。 – user3258271

回答

1

在(start,end)上添加複合索引將解決您的問題。

您的表格大小很大(6m行),但查看沒有文本字段的列,因此在我看來,只需通過添加索引來解決問題,尤其是您沒有頻繁更新,因此您的索引統計數據將始終保持最新。

我會建議使用ehcache與休眠的緩存實體,但在這種情況下,我認爲你不需要它。在其他情況下您可能需要它。

如果索引沒有幫助(我認爲不會這樣),那麼它可能是由於索引基數。我不認爲這只是您的數據案例。

到另一個需要考慮的事項:

  • 因爲您的數據主要是爲讀我建議你使用MyISAM引擎而不是InnoDB的,如果不是這種情況了。
  • 最後,我不知道findByStartLessThanAndEndGreaterThan是什麼SQL輸出,但我建議你在你的hibernate配置中將show_sql設置爲true,並檢查生成的真實SQL。基於此,如果需要,您可以使用更好的HQL查詢
+0

600萬行不是「巨大的」。它幾乎沒有平均;) – fge

+0

感謝您的有用答覆,在我的Web應用程序和數據庫調優的小經驗,我會認爲它是巨大的。 – Vicky21

+0

其實,我想添加一個關於我上面的ehcache句子的評論。讀它我認爲它給人的印象是使用ehcache被推薦用於類似的情況。那麼通常我們將它用於很少變化的小實體,而不是上面的情況。因此,將它與Hibernate一起使用會很好,但我會用它來緩存小表 – Vicky21