2014-12-07 65 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必须提供的所有功能。

至于索引,你不能简单地使用任何字段组合。最好使用最常用的索引,并尝试使用覆盖尽可能多的用例的复合索引。有时查询执行程序不会使用索引,因为否则它会更快,所以强制索引并不总是一个好主意。生产系统可能不适合您的测试环境。