gpt4 book ai didi

java - 数据库中的灵活搜索

转载 作者:行者123 更新时间:2023-11-29 23:20:32 26 4
gpt4 key购买 nike

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

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

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

另外,我认为 mysql 没有使用正确的索引,因为当我让 hibernate 记录 sql 命令时,我几乎总是可以通过强制索引来提高响应时间...我开始使用类似 this trick 的内容到 Criteria 来强制使用特定的索引,但我对“if”链并不感到自豪。我得到类似的东西

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

感觉很糟糕

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

最佳答案

Hibernate 非常适合写入,而 SQL 仍然擅长读取数据。 JOOQ对于您的情况来说可能是更好的选择,而且由于您使用的是 MySQL,所以无论如何它都是免费的。

JOOQ is like Criteria on steroids ,并且您可以使用用于 native 查询的确切语法构建更复杂的查询。您拥有类型安全以及当前数据库必须提供的所有功能。

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

关于java - 数据库中的灵活搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27346031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com