我的表包含一系列独特的字符串,我需要提供快速查找(除了内存缓存)。
@Entity
public class UniqueString {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Basic
@NaturalId
private String stringId;
}
最初我将stringId
变量设为@Id
,但事实证明,当按字符串ID检索对象时,某些数据库(例如oracle)进入full table scan
;因此我改为长。
如何从字符串UniqueString
快速访问stringId
对象。到目前为止,我看到两种解决方案:
stringId
注释@id
并尝试找到某些数据库中full table scans
出现原因的修复long
(同时失去精度)并使用查找表返回与散列匹配的所有对象,然后将它们的stringId
属性进行比较以找到我们正在查找的匹配项例如:
LookupTable UniqueString
+----+------+ +----+----+----------+
|hid | hash | | id |hid | stringId |
+----+------+ +----+----+----------+
| 1 | 123 | -------------> | .. | 1 | .... |
| 2 | 321 | `-----> | .. | 1 | .... |
+----+------+ +----+----+----------+
意见,建议?
[编辑] 好的,我意识到我的上表插图可以简单地归一化为
UniqueString
+----+-----+----------+
| id |hash | stringId |
+----+-----+----------+
| .. | 123 | .... |
| .. | 123 | .... |
| .. | 321 | .... |
+----+-----+----------+
由于我怀疑以下两个查询的执行情况大致相同,因此会产生重大影响:
from UniqueString where hash='123'
from UniqueString where stringId='abc'
答案 0 :(得分:4)
确保数据库中stringId列的索引
只需使用hql或条件API查询数据库
配置查询缓存以缓存此类查询。
答案 1 :(得分:1)
这更多是关于如何将所述列保留在数据库中。我认为正确的方法是在列上定义哈希索引,并将实体中的字段标记为索引。