2014-10-08 2 views
1

속도 최적화.MYSQL - 속도 (및 유일한 속도)에 대한 검색 테이블 최적화

카탈로그의 경우 약 150,000 개의 항목이 있습니다. 각 항목 레코드에는 8 개의 검색 필드와 하나의 Json 데이터 문자열이 있습니다. (아니요 : int; 검색 필드는 최대 30 자, JSON 최소 200 : 최대 2000 자)

항목 No는 고유 한 필드이며 다른 모든 필드는 고유하지 않습니다.

No Search1 Search2 ... Search8 JSON_datastring 
1  a1  a2 ... a8  {...json...} 
2  b1  b2 ... b8  {...json...} 
.. 
x  a1  b2 ... c8  {...json...} 

사용자는 8 개의 필드 각각을 검색 할 수 있습니다. 그는 전체 필드를 검색 할 수 있습니다 ,

WHERE Search1 = 'x' 

분야

WHERE Search1 LIKE 'x%' 

의 시작 또는

WHERE Search1 LIKE '%x%' 

내 첫 번째 방법은 유지하는 것입니다 분야의 일부 테이블에있는 모든 데이터를 검색하고 각 검색 colomns에 인덱스를 넣습니다. 그러나 더 빠른 방법이 있는지 궁금합니다.

여기서 목표는 가능한 모든 일치하는 JSON_ 데이터 스트림을 얻는 것입니다. '선택'속도 만이 여기에 있습니다 (사용자는 업데이트/삽입/삭제 명령을하지 않습니다). 메모리 또는 디스크 공간이이 프로젝트와 관련성이 거의 없습니다. 카탈로그를 일주일에 한 번만 업데이트해야하므로 가져 오기 및 업데이트 시간도 커지지 않습니다.

나는 MYSQL 데이터베이스로 작업하고 있습니다. 테이블의 데이터는 매주 CSV 파일에서 가져옵니다. MYSQL 데이터베이스를 완벽하게 제어 할 수 있습니다.

검색의 약 60 %가 전체 필드에있을 것으로 예상됩니다. 연간 약 20,000 건의 기록 150,000 개가 현재 기록됩니다. 동시 사용자 수 : 현재 예상치가 없습니다.

검색 속도를 향상시키는 방법에 대한 제안 사항이 있습니까? 저는 아직 프로젝트의 설계 단계에 있습니다.

답변

1

LIKE %x%에는 항상 전체 테이블 스캔이 필요합니다. 사용 된 색인에 상관없이이를 최적화 할 수 없습니다. 대신 FULLTEXT 색인이 필요하고 LIKE 대신 MATCH ... AGAINST을 사용하도록 쿼리를 수정하면 필드에 대해 FULLTEXT 검색을 설정해야합니다. 정확한 데이터를 알지 못하면 추가 개선이 어렵지만 일반적으로 검색에서 MySQL을 오프로드하여 검색을 별도 서비스 (Lucene/Solr 또는 Sphinx)로 옮길 수 있습니다. 성능면 에서뿐만 아니라 검색 기능을 위해 제작 된 기능면에서 더 적합 할 수 있습니다.