2011-09-04 4 views
3

우리 애플리케이션 중 하나에서 우리는 평범한 테이블 형식의 데이터를 보유해야하며 사용자는 열 중 하나에서 사용자 측 자동 완성을 수행 할 수 있어야합니다.자동 완성을위한 Solr 대 MySQL 성능

우리가 생각해 낸 초기 솔루션은 MySQL을 Solr과 결합하여 (MySQL이 데이터를 보유하고 Solr이 토큰 화 된 열을 보유하고 그 결과로 ID를 반환하도록) 구현하는 것이 었습니다. 그러나 최근에는 (개발자가 Solr에서 일부 데이터를 저장하기 시작했습니다. MySQL 테이블과 그 작업이 Solr이 제공 할 수있는 것이 아니기 때문에 개발자는 Solr이 제공하지 못하는 데이터가 아니므로)이를 병합하고 둘 중 하나를 제거 할 수 있을지도 모른다고 생각했습니다.

그래서 우리는에 있었다 중 하나 (1) (2) 자동 완성을 위해 MySQL을 사용 SOLR에 모든 데이터를 이동

끔찍한 그래서 그것을 (2), I로드 시작과 함께 촬영을했다 (1) 소리 MySQL에 대한 단일 컬럼의 데이터는 MySQL과 Solr 모두에서 모든 캐시를 사용할 수 없도록 설정되었으며, 두 데이터베이스 모두에서 매우 유사한 쿼리를 수행 할 수있는 작은 웹 애플리케이션을 작성했으며 [1], 로컬 및 유사한 환경 모두에 대해 몇 가지 JMeter 시나리오를 실행했습니다 . 결과는 Solr에게 2.5-3.5x 장점을 보여 주지만 결과가 완전히 틀리거나 잘못 될 수 있다고 생각합니다. 대한

그래서, 당신은 어떤 제안 :

  1. 올바르게이 두 시스템을 벤치마킹, 나는 가 JVM에 환경 [MySQL로 유사 제공에 필요한 믿습니다.
  2. 이 시스템을 설계 중입니다.

모든 리드에 대해 감사드립니다.

[1] SELECT column FROM table WHERE column LIKE 'USER-INPUT%' (MySQL) 및 column:"USER-INPUT" (솔라)

답변

14

저는 최근 웹 사이트를 데이터베이스 (포스트 그레스)의 데이터를 가져 오는 것으로부터 Solr의 모든 데이터를 가져 오는 것으로 옮겼습니다. 믿을 수없는 속도의 차이. 호주 교외 (약 15,000 개)에 대해서도 자동 완성 기능을 갖추고 있으며 몇 밀리 초 만에 자동 완성 기능을 제공하므로 jQuery를 사용하는 ajax 자동 완성 기능이 거의 즉시 반응합니다.

모든 업데이트는 원본 데이터베이스에 대해 수행되지만 사이트는 주로 읽히는 사이트입니다. 레코드가 업데이트되고 레코드의 Solr에 다시 색인을 생성 할 때 이벤트를 발생시키는 트리거를 사용했습니다.

다른 큰 속도 개선은 항목을 렌더링하는 데 필요한 사전 캐싱 데이터입니다. 즉, 데이터를 비정규 화하고 Solr 인덱싱 시간에 많은 양의 재료를 미리 계산하므로 렌더링이 웹 사용자와 초고속 사용자에게 쉽습니다.

또 다른 장점은 데이터베이스를 어떤 이유로 오프라인 상태로 만들 필요가있을 때 사이트를 읽기 전용 모드로 설정할 수 있다는 것입니다. 이제 Solr로 되돌아갑니다. 적어도 사이트가 완전히 다운되지는 않습니다.

가능한 한 속도와 확장 성 모두에서 Solr을 사용하는 것이 좋습니다.

+0

멋지게 들립니다. 나는 Solr에게 상당히 익숙하다. 테이블에 JOIN과 GROUP BY를 할 수 있니? 이 표의 데이터는 5 백만 레코드의 순서입니다. Solr의 사용을 제안 하시겠습니까? 감사! – parsa

+0

Solr에는 느슨한 스키마가 있으므로 모든 것이 단일 테이블에 저장됩니다. 각 solr core (인덱스)는 테이블이 아닌 데이터베이스에 해당합니다. 「GROUP BY」는 패셔 닝을 봐주세요. http://wiki.apache.org/solr/SolrFacetingOverview. – aitchnyu

+2

@parsa solr은 거대한 데이터 세트를 보유해도 좋습니다. 조인 개념이 없습니다.기본적으로 solr "문서"(필드/값 쌍)를 색인화하므로 사용자가 원하는만큼 비정규 화합니다. 따라서 렌더링해야하는 모든 내용이 문서에 저장됩니다. 문서가 너무 크거나 데이터가 반복되는 것을 염려하지 마십시오. 속도가 중요합니다. – Bohemian