2011-02-09 7 views
1

스핑크스 검색 엔진으로 색인을 생성하려는 데이터베이스가 있습니다. 문제는 Sphinx가 각 문서에 대해 정수 ID를 요구하지만 데이터베이스에 기본 키로 GUID (실제로는 임의의 GUID 유사 문자열)가 있다는 것입니다. 난 as described in this recipe 비행에 합성 ID를 생성 할 수 있지만 그것은 전체 인덱스에만 좋습니다. 증분 인덱스 또는 런타임 인덱스를 갖고 싶다면 어떻게해야합니까? 증분 인덱스 및 런타임 인덱스와 함께 사용할 수있는 Sphinx를 사용하여 GUID를 처리하는 모범 사례가 있습니까? 문제의 데이터베이스는 꽤 클 것이므로 자주 다시 인덱스하고 싶지는 않습니다.스핑크스 및 GUID

답변

9

실시간 인덱스 : 당신은 숫자 값에 숫자가 아닌 GUID를 변환 할 수 있습니다이 같은 (당신은 숫자로 캐스트 CRC32 또는 MD5 사용할 수 있습니다) :

mysql> select conv(mid(md5('abc'), 1, 16), 16, 10); 
+--------------------------------------+ 
| conv(mid(md5('abc'), 1, 16), 16, 10) | 
+--------------------------------------+ 
| 10376663631224000432     | 
+--------------------------------------+ 
1 row in set (0.00 sec) 

테스트를하거나 그림을 구글 어떤 알고리즘이 충돌을 덜 줄 것인가.

숫자 ID를 받으면 Sphinx RT 색인에 문서를 INSERT 할 수 있습니다.

증분 인덱스 : 위에서 설명한 것과 같은 방법을 사용하여 GUID를 숫자로 변환 할 수 있지만 인덱스의 주요 부분이 델타 빌드를 완료 한 곳을 기억해야합니다. 테이블에 "업데이트 됨"또는 "삽입 됨"필드가 있으면 쉽게 수행 할 수 있습니다. sql_query_range는 "select ... where where updated> (select last_updated from sphinx_helper)"와 같을 것입니다. 이 경우 순차적이지 않으므로 ID를 기반으로 할 수 없습니다.

내가 11.8M 다른 도메인에 MD5 너 한테의 절반을 테스트했습니다

mysql> update domain_tmp set hash = conv(mid(md5(domain), 1, 16), 16, 10); 
Query OK, 5901483 rows affected (1 min 59.03 sec) 
Rows matched: 11800403 Changed: 5901483 Warnings: 0 

mysql> select count(*) from domain_tmp; 
+----------+ 
| count(*) | 
+----------+ 
| 11800403 | 
+----------+ 
1 row in set (16.30 sec) 

mysql> select count(distinct hash) from domain_tmp; 
+----------------------+ 
| count(distinct hash) | 
+----------------------+ 
|    11800403 | 
+----------------------+ 
1 row in set (1 min 5.51 sec) 

즉 어떤 충돌이 발생하지 않습니다. 따라서 데이터 세트에 더 많은 문서가 없으면 md5의 절반을 사용하는 것이 좋습니다.

+0

새로운 ID를 생성하기 위해 모든 테이블 구조를 변경할 수는 없습니다 (ORM과 유사한 시스템에서 생성 된 테이블 구조의 테이블이 50 개 이상 있습니다). 아마도 md5 방법을 사용할 수 있습니다 ...하지만 충돌에 대해 걱정하고 있습니다. – StasM

+1

테이블 구조를 변경할 필요가 없습니다. Sphinx 인덱서로 SELECT를하면 새 ID를 즉시 생성 할 수 있습니다. 충돌에 관해서 - md5의 절반은 꽤 괜찮아 보입니다. 나는 11.8M의 다른 영역에서 충돌을 테스트했습니다. 충돌은 없습니다. –