2012-10-26 3 views
0

검색 결과 사용자 ID 값 (1,2,3,4,5,6 ... 등)의 목록을 반환하는 다음 시나리오가 있습니다. 검색을 다시 실행하려면, 결과는 약간의 시간이 주어지면 바뀌는 것이 보장됩니다. 그러나 나는 미래에 사용될 검색 결과의 인스턴스를 저장해야합니다.향후 사용을위한 검색 결과 저장

기준이있는 search_id에 대한 레코드를 만들고 반환 된 모든 행을 연관된 search_id와 함께 다른 테이블에 삽입하는 현재 구현 (레거시)이 있습니다.

table search_results 
    search_id unsigned int FK, PK (clustered index) 
    user_id unsigned int FK 

이 테이블은 수백만 개의 레코드로 성장했기 때문에 용인 할 수없는 접근 방법입니다. 나는 테이블을 파티션하는 것을 고려해 봤지만, 나는 수많은 파티션 (1000s)을 가질 것이다.

검색 결과가 다른 곳에서 사용되지 않으면 만료 된 기존 표가 최적화되어 모든 검색 결과가 다른 곳에서 참조됩니다.

현재 스키마에서 결과를 직렬화 된 배열 또는 XML로 저장할 수 없습니다. 검색 결과 정보를 효율적으로 저장하려고합니다. 레코드의 수에 부담을주지 않고 효율적으로 액세스 할 수 있습니다.

편집 : 답변 해 주셔서 감사합니다. 검색 자체를 실행하는 데 아무런 문제가 없지만이 경우 수신자 목록에 대한 검색 결과 집합이 반복적으로 사용됩니다. 저장 목적은 주어진 시간에 데이터의 스냅 샷을 정확하게 저장하는 것입니다.

답변

2

대답은 쿼리 결과를 저장하지 않습니다. 그것은 끔찍한 생각입니다!

  • 데이터가 부실 (당신이 알아내는 것 같은) 당신이 정말로 (정말 정말) 그것이 scalable
  • 하지
  • 필요 하지 않는 아주 나쁜 인 statefulness 소개 저장하자마자

정확한 접근 방식은 쿼리/데이터베이스를 신속하게 수용 할 수 있도록 수정하는 것입니다.

더 나은 SQL 및/또는 색인 등을 사용하여 더 빨리 쿼리를 수행 할 수없는 경우 lucene (또는 텍스트 기반 검색 엔진)을 사용하고 데이터베이스를 비정규 화하는 것이 좋습니다. Lucene 쿼리는 엄청나게 빠릅니다.


나는 최근에 정확히 당신이하고있는 일을 한 대형 웹 사이트에 한 : 그것은 시도 최고 속도까지 쿼리 세션 개체에서 생산 관계형 데이터베이스에서 쿼리 결과를 캐싱되었다, 그러나 그것은이었다 어쨌든 훨씬 더 빨라진 것은 아니었다. 내 시간 전에, "수석"자바 개발자 (그의 이름은 Jam ..로 시작하여 .illiams로 끝났다)는 실제로 바보 인 사람이 좋은 생각이라고 결정했다.

Solr (자바 맞춤형 루씬 구현)에 넣고 Solr을 관계형 데이터베이스 (작업 대기열 사용)로 최신 상태로 유지했으며 웹 쿼리는 이제 겨우 몇 밀리 초입니다.

+0

더 이상 당신과 동의 할 수 없습니다 –

0

모든 검색을 저장해야하는 이유가 있습니까? 사용자가 사용할 수있는 최신 정보를 원하십니까?

먼저 인정 하겠지만 훌륭한 해결책은 아닙니다. 사용할 수있는 현재 하나 [SYS_Searches]

  • 저장 스크립트와 함께 다른 데이터베이스가 SELECT가 INTO [SYS_Searches] .Results_ {SEARCH_ID}
  • 검색하여 간단한을 할 수있는 스크립트가 일치 모두 선택

    • 설정 표.

    장점 :는 모든 검색이 깔끔하게

  • 검색 쿼리는 매우 간단합니다 [바람직 다른 DB에] 그것의 자신의 테이블로 포장된다

    • 검색 시간이 있어야한다 아주 빠른 테이블 스캔은 없습니다.

    단점 :

    • 당신은 y는 사용자가 저장할 수있는 검색 * 모든 X 사용자를위한 테이블이됩니다.

    결과가 만료되는 관리가 있거나 사용자가 캐시 된 검색 결과 집합을 1 개만 가질 수있는 경우가 아니면 매우 바보가 될 수 있습니다.

    예쁘지 않지만 다른 방법을 생각할 수 없습니다.