2011-02-25 3 views
0

(메모리 캐싱 이외에) 빠른 검색을 제공해야하는 일련의 고유 한 문자열을 포함하는 테이블이 있습니다. Hibernate 테이블에서 고유 한 문자열을 빠르게 검색하는 방법

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

    @Basic 
    @NaturalId 
    private String stringId; 
} 

처음에 나는, 그러나 그것은 문자열 ID로 객체를 검색 할 때 일부 데이터베이스 (예를 들어, 오라클) full table scan에 들어간 것으로 밝혀졌다, @IdstringId 변수를했다; 그래서 나는 대신에 길게 바꿨다.

문자열 stringId에서 UniqueString 개체에 신속하게 액세스 할 수 있습니까? 다시 말하지만, @idstringId 주석을 달고 (정밀도를 잃어버린 동안) full table scanslong에 일부 데이터베이스에

  • 해시 문자열을 발생하는 이유에 수정을 찾기 위해 시도하고 조회를 사용

    • : 나는 두 가지 솔루션 지금까지 참조 표를 사용하여 해시와 일치하는 모든 객체를 반환 한 다음 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
    1. 바로 이런 종류의 쿼리를 캐시 HQL 또는 기준 API를

    2. 구성 쿼리 캐시를 사용하여 데이터베이스를 조회 데이터베이스

    3. 에서 stringId의 콜 럼에 인덱스가 있는지 확인합니다.

    1

    위의 내용은 데이터베이스에서 해당 열을 유지하는 방법에 대한 것입니다. 올바른 방법은 열에 대해 해시 인덱스를 정의하고 엔티티의 필드를 인덱스로 표시하는 것입니다.

    관련 문제