2013-05-16 2 views
1

나는 거대한 mysql 데이터베이스 (5 십억 개의 레코드)를 색인 할 필요가있다. 나는 거의 생성되지, 갱신 또는 이름 LIKE '푸 %'거대한 mysql 데이터베이스에서 빠른 검색

은 이미 필드에 내 인덱스를 설정 한 tbl_person SELECT * FROM처럼

일부 요청을 삭제합니다. 하나

읽기 요청에 5billions 기록 테이블 또는 500millions 기록 테이블 (10)의 요청에 따라

1 단일 요청 최적의 성능을 위해 더 나은 후의 결과를 참여합니다.

+1

쿼리/인덱스 공간/사용중인 메모리/시스템에서 수행중인 작업/사용중인 디스크 종류 또는 기타 몇 가지 사항에 따라 달라질 수 있습니다. 완전한 추측을 원하는 경우가 아니라면 할 수있는 최선의 방법은 자체 하드웨어를 사용하는 테스트입니다. –

답변

1

크기가 일 수 없기 때문에 LIKE 절을 사용하면 "좋은"성능을 얻을 수 없습니다.은 인덱스를 사용할 수 없습니다.

이와 같은 효율적인 쿼리가 필요한 경우 다양한 스토리지 디자인을 고려해야합니다. 일반적인 방법은 문자열의 각 길이에 대해 별도의 색인화 된 열을 사용하는 것입니다.

는 크게웨어 하우스의 데이터를 증가

  • fooba
  • 으로 fooB
  • foo는
  • FO
  • f를

    1. 는 foobar : 예를 들어

      , 그러나 당신의 요구 사항은 이것이 적절한 절충인지를 보여줄 것입니다 ... 공간이 성능보다 저렴합니까? 당신 만이 그 해답을 알고 있습니다.

      편집 : 이제 질문의 두 번째 부분을 봅니다. 5b 레코드에 대해 하나의 쿼리를 사용하거나 500m rec에 10 쿼리를 사용하는 것이 더 바람직한지 묻습니다.

      단일 쿼리로 더 나은 결과를 얻는 것이 거의 확실하다고 할 수 있습니다 쿼리를 분기하는 효과적인 샤딩 시스템이 없다면 ... 기존 인프라를 확인하기 위해 테스트해야 할 것입니다.

  • +0

    쿼리에 따라 다르 겠지만 와일드 카드로 시작하지 않는 'LIKE (샘플 쿼리로)'은 인덱스를 잘 사용해야합니다. '% endswith'는 심각하게 나쁜 패턴입니다. –

    +0

    예, 'LIKE startswith %'는 언급 한 것처럼 sargable하지만 OP가 질문을 간략하게 생각합니다. 인덱스를 적절히 사용한다면 그는 적용 할 수있는 단순한 픽스가 있습니다. – Matthew

    +0

    당신은 LIKE 키워드를 잊어 버린 경우 1 개 단일 쿼리 (5billions 기록) SELECT * tbl_person에서 WHERE SELECT 이름 = 'foo는' 10 쿼리 (500millions 기록) * tbl_person에서 WHERE 이름 = 'foo는'하나 개의 머신에 대하여 –

    6

    할 수있는 일이 많습니다. 첫째, 사람 이름으로 정기적으로 검색하는 경우, 사람 이름의 처음 또는 처음 몇 글자로 표를 분할하는 것을 고려하십시오. Partitioning Types을 참조하십시오. 예를 들어

    , 정수로 검색하는 것이 훨씬 빠르고 때문에, 당신은 필드는 이름의 2 개 또는 3 문자 먼저 사람을 나타내는 SMALLINT입니다 name_abbr라고 할 수있다. 이 필드의 색인을 생성하고 파티션을 나누십시오! 따라서 aaa은 1이되고, aab은 2가됩니다. 당신의 쿼리는 다음과 같이 보일 것입니다 :

    SELECT * FROM Table WHERE name_abbr=123 AND name LIKE 'foo%'; 
    

    이제는 올바른 파티션에 도달하고 LIKE는 훨씬 더 작은 레코드 세트 만 확인하면됩니다.

    할 수있는 많은 작업이 있지만 큰 데이터 세트의 경우 데이터를 그룹으로 나누어 가능한 한 쿼리마다 항상 정수를 사용하는 것이 가장 좋습니다. 또한 EXPLAIN 키워드를 사용하여 쿼리에서 사용할 인덱스와 파티션을 사용하고 있는지 확인하십시오.

    +0

    멋진 아이디어, 감사합니다. –

    +0

    +1 제안 - 파티션 아이디어. – Alyas

    관련 문제