2014-12-07 63 views
0

我有一個遺留系統,允許用戶管理(MySQL)數據庫中稱爲「TRANSACTION」的一些實體,並映射到Java中的Transaction類。事務對象有大約30個字段,其中一些是DB中的列,其中一些是連接到另一個表,如CUSTOMER,PRODUCT,COMPANY和類似的東西。在數據庫中靈活搜索

用戶可以訪問「搜索」屏幕,在這裏可以使用TransactionId和一些額外的字段進行搜索,但他們需要更多的靈活性。基本上,他們希望能夠使用TRANSACTION或任何鏈接表中的任何字段進行搜索。

我不知道如何使搜索既靈活又快速。有什麼辦法嗎?我不認爲有一個索引每列組合是一個有效的解決方案,但全表掃描也是無效的......是否有任何合理的設計?我使用Criteria來構建查詢,但這不是問題。

另外,我認爲mysql沒有使用正確的索引,因爲當我使hibernate登錄sql命令時,幾乎總是可以通過強制索引來改善響應時間......我開始使用類似this trick適用於強制使用特定索引的標準,但我並不爲「if」鏈感到自豪。我越來越像

if(queryDto.getFirstName() != null){ 
    //force index "IDX_TX_BY_FIRSTNAME" 
}else if(queryDto.getProduct() != null){ 
    //force index "IDX_TX_BY_PRODUCT" 
} 

,如果問題是「過於開放」,我認爲這是一個典型的問題,感覺太可怕了

很抱歉,但我不能找到一個好辦法

回答

0

Hibernate非常適合寫作,而SQL依然擅長讀取數據。 JOOQ在你的情況下可能是一個更好的選擇,因爲你使用的是MySQL,所以它是免費的。

JOOQ is like Criteria on steroids,您可以使用您用於本機查詢的確切語法構建更復雜的查詢。您有類型安全和您當前DB必須提供的所有功能。

至於索引,你不能簡單地使用任何字段組合。最好使用最常用的索引,並嘗試使用覆蓋儘可能多的用例的複合索引。有時查詢執行程序不會使用索引,因爲否則它會更快,所以強制索引並不總是一個好主意。生產系統可能不適合您的測試環境。