灵活搜索数据库

时间:2014-12-07 18:13:36

标签: java mysql sql hibernate

我有一个遗留系统,允许用户在(MySQL)数据库中管理一些名为“TRANSACTION”的实体,并映射到Java中的Transaction类。事务对象有大约30个字段,其中一些是DB中的列,其中一些是连接到另一个表,如CUSTOMER,PRODUCT,COMPANY等等。

用户可以访问“搜索”屏幕,允许他们使用TransactionId和一些额外字段进行搜索,但他们需要更大的灵活性。基本上,他们希望能够使用TRANSACTION中的任何字段或任何链接表进行搜索。

我不知道如何灵活快速地进行搜索。有什么办法吗?我不认为为每个列组合都有一个索引是有效的解决方案,但是全表扫描也无效......是否有任何合理的设计?我正在使用Criteria构建查询,但这不是问题。

另外,我认为mysql没有使用正确的索引,因为当我使用hqlnate log sql命令时,我几乎总能通过强制索引来改善响应时间...我开始使用类似{{ 3}}适应Criteria强制使用特定索引,但我并不为“if”链而自豪。我有点像

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

感觉太可怕了

对不起,如果问题“太开放”,我认为这是一个典型的问题,但我找不到一个好的方法

1 个答案:

答案 0 :(得分:0)

Hibernate非常适合编写,而SQL仍然擅长读取数据。在你的情况下JOOQ可能是一个更好的选择,因为你使用的是MySQL它无论如何都是免费的。

JOOQ is like Criteria on steroids,您可以使用您用于本机查询的确切语法构建更复杂的查询。您具有类型安全性和当前数据库提供的所有功能。

对于索引,您不能简单地使用任何字段组合。最好对最常用的索引进行索引,并尝试使用覆盖尽可能多的用例的复合索引。有时查询执行器不会使用索引,因为否则会更快,因此强制索引并不总是一个好主意。对您的测试环境起作用的东西可能对生产系统不起作用。