0

我有一个包含一系列唯一字符串的表,我需要提供快速查找(除了内存缓存)。

@Entity
public class UniqueString {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Basic
    @NaturalId
    private String stringId;
}

最初我有stringId变量 as ,但事实证明,在通过字符串 id 检索对象时@Id,某些数据库(例如,oracle)进入了;full table scan因此我改用 long 。

如何UniqueString从字符串中快速访问对象stringId。到目前为止,我看到了两种解决方案:

  • 再次,注释stringId@id尝试找到解决full table scans某些数据库中出现的原因
  • 将字符串散列成 a 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'
4

2 回答 2

4
  1. 确保数据库中的 stringId 列上有索引

  2. 只需使用 hql 或条件 API 查询数据库

  3. 配置您的查询缓存以缓存此类查询。

于 2011-02-25T17:28:53.170 回答
1

这更多的是关于如何将所述列保存在数据库中。我认为正确的方法是在列上定义哈希索引并将实体中的字段标记为索引。

于 2011-02-25T18:53:27.810 回答