2013-08-10 4 views
3

5M 행의 대형 데이터 세트가 있습니다. 데이터 세트의 필드 중 하나는 'article_title'입니다. 사이트에서 작성중인 자동 완성 기능을 실시간으로 검색하고 싶습니다.모든 DB에서 '% phrase %'검색을 빠르게 수행 할 수 있습니까?

나는 잠재적 인 DB 솔루션으로 MySQL과 MongoDB를 실험 해왔다. 'something %'와 같이 색인을 사용할 때 둘 다 잘 수행되지만 '% something %'처럼 내에서 내의 문자열을 일치시켜야합니다.

MySQL과 MongoDB는 모두 전방 검색을 사용하는 인덱스로 0.01 초, 전체 문자열 검색으로 약 6 초가 걸렸습니다.

이 문제에 대한 일반적인 접근 방식은 무엇인지, 전체 DB에서 문자열 -in- 문자열 유형 검색을 검색해야한다는 것을 알고 있습니다. Solr과 Sphinx는이 문제에 대해 지나치게 심한 것처럼 보이므로 가능한 경우 사용하지 않는 것이 좋습니다.

RAM이 2GB이고 SSD가 40GB 인 상자를 가지고 있다면 (응답 시간은 얼마 남았습니까?) 서브 초 응답 시간을 얻을 수 있습니까? 미리 감사드립니다.

-

업데이트 : 나는 전체 텍스트 인덱스를 시도하고 결과가 매우 빠른 반면, 그것은 정말 문자열에서 문자열 검색을 만족하지 않는다 ("presiden"는 "대통령을"일치하지 않음) . string-in-string과 5M 행 데이터 세트를 일치시키는 방법을 찾고 있습니다.

+0

MySQL (버전, 엔진, 구조체, 사용 된 쿼리) 및 MongoDB (cfg, 버전, 클라이언트)에 대한 추가 정보 제공 – kwarunek

+0

MySQL 5.1.7, Mongod 2.4.5. MySQL 테이블은 독점적으로 읽기 전용이므로 성능만을 찾고 있기 때문에 MyISAM입니다. – soulkphp

+0

http://stackoverflow.com/questions/17973889/what-is-the-best-optimization-technique-for-a-wildcard-search-through-100-000-re/18025870#18025870도 확인해야합니다. 제목, 신체 내용에 대해서는 작동하지 않음 – rlb

답변

2

MySQL의 경우 full-text index을 만들 수 있습니다. 간단히 말하면 전체 텍스트 인덱스는 각 단어를 인덱싱하여 부분 텍스트를 빠르게 일치시킵니다. 인덱스를 만들려면 당신은 작성합니다 그 후

alter table YourTable add fulltext index(article_title); 

을 당신이 검색 할 수 있습니다 : 그것은 MongoDB also has text indexes 것으로 보인다

select * from YourTable where match(article_title) against ('something'); 

. 두 경우 모두 인덱싱을 미세 조정할 수 있다고 생각합니다. 따라서 어느 것이 더 적합한 지 테스트해야합니다.

+0

알아 두십시오 ... 전체 텍스트 인덱스를 사용하면 더 나은 결과를 얻을 수 있지만 부분 텍스트 일치 속도가 빨라지지는 않습니다.나는 지금 그것을 할 것이고 결과를 후속 조치 할 것이다. 감사! – soulkphp

+2

필자가 아는 한, 전체 텍스트 인덱스는 * words *를 인덱싱합니다 : 패턴 '% bar %'는'foobar','barfoo' 및'foobarfoo'와 일치 할 것이고'bar '전체 텍스트 색인에서 * substring *을 포함하는 단어를 찾을 필요가 없습니다. 또는 그 주제에 관한 나의 지식이 구형인가? –

+0

@SylvainLeroux 나는 네가 옳다고 생각한다. 그럼에도 불구하고, 그 제한은 OP에 의해 기술 된 목적을 위해 받아 들여질 수있다. – GolezTrol

1

일반적으로 BTREE으로 구현되는 일반 색인을 사용하는 경우 색인은 왼쪽에서 오른쪽으로 작동합니다. something%과 같은 검색어는 색인의 왼쪽이 사용될 수 있기 때문에 작동합니다. %something 또는 %something%과 같은 쿼리에서는 이러한 인덱스를 사용할 수 없습니다.

A Full-Text index은 일반적이지 않은 단어의 색인을 생성한다는 점에서 다릅니다. 예를 들어 the과 같은 일반적인 단어 (stop-words)는 제외됩니다. MySQL full-text 색인은 3 자 이하의 단어도 제외합니다.

작은 경우에는 내장 된 전체 텍스트 색인이 정상적으로 작동합니다. 기본 제공되는 전체 텍스트 인덱스는 일반적으로 지금까지만 사용할 수 있으므로 어떤 경우에는 Elastic Search 또는 Spynx과 같은 전용 솔루션을 사용해야 할 수도 있습니다.

관련 문제