2012-03-25 1 views
3

나는 80 백만 가지 레코드가있는 테이블을 가지고 있습니다. 테이블의 구조 :검색을 위해 LIKE를 사용하는 대형 MySQL 테이블의 분할

  • ID - 자동 증가,
  • 코드 - 5 100 자까지 영숫자 코드,
  • 다른 분야.

가장 사용되는 쿼리는 쿼리의 숫자뿐만 아니라 recodrs 카운트로 성장하고

SELECT * FROM table 
WHERE code LIKE '%{user-defined-value}%' 

입니다. 아주 빨리 성능 문제가 발생할 것입니다.

파트에서 테이블을 분할 할 방법이 있습니까? 아니면 테이블을 최적화하는 다른 방법이 있을까요?

답변

2

검색에서 선두 %가 여기에 있습니다. 그것은 모든 색인의 사용을 무효화합니다.

내가 생각할 수있는 유일한 점은 코드 길이에 따라 테이블을 분할하는 것입니다.

예를 들어, 입력 된 코드가 10자인 경우, 10 자 코드로 시작하는 백분율 기호없이 테이블을 검색 한 다음 11 자 코드로 선행 백분율 기호로 표를 검색하고 그 다음에 12 자의 문자 코드와 함께 백분율 기호가 나오는 테이블.

이렇게하면 결코 일치하지 않는 10 자 미만의 모든 코드를 검색하지 않아도됩니다. 또한 검색 중 하나 (첫 번째 색인)에 대한 색인을 활용할 수 있습니다.

이렇게하면 테이블 크기가 다소 작게 유지됩니다.

UNION을 사용하면 모든 쿼리를 한 번에 수행 할 수 있지만 쿼리를 동적으로 생성하려고 할 수 있습니다.

FULLTEXT 인덱싱이 더 나은 해결책인지 확인해야합니다.

+0

실제로 "%"를 앞당기는 문제를 해결하기 위해 "code_inverted"열을 이미 추가했습니다. 제안한대로 코드 길이만큼 테이블을 분할하려고합니다. – Leksat

+0

니스. code_inverted는 후행 %가없는 경우에만 앞의 %를 사용하여 문제를 해결한다는 점에 유의하십시오 (이는 새 선행 %가됩니다). :) – Ami

0

일부의 생각 :

  1. 당신은 특정 조건에 따라 여러 개의 작은 테이블로 테이블을 분할 할 수 있습니다. 예를 들어 ID 일 수도 있고 code 일 수도 있고 다른 필드 일 수도 있습니다. 그것은 기본적으로 당신이 가능한 경우보십시오 다른 테이블

  2. MySQL Partitioning

  3. 를 테이블의 레코드 분할 다른 종류의 특정 유형을 유지하는 것을 의미한다.오래된 항목을 제거하거나 적어도 LIKE의

  4. 대신 다른 아카이브 테이블로 이동 생각할 수 SELECT *을 실행하는 것보다

  5. 오히려 정규 표현식 검색을위한 정규 표현식을 사용하는 것이 좋습니다에만 선택적으로 열을 선택하려고 SELECT id, code, ...

  6. 이 쿼리가 사용자 입력 값이 code 열과 비교되어 사용자에게 결과가 표시되는 응용 프로그램 내 검색과 관련이 있는지 확실하지 않습니다. 하지만 그렇다면 정확한 검색어가 필요한지 사용자에게 묻는 것처럼 검색 쿼리에 옵션을 추가하거나 매치 등으로 시작해야합니다.

  7. 먼저해야 할 점이 있지만 테이블에 올바른 인덱스가 있다고 가정합니다.

  8. 더 많은 쿼리 캐시를 사용해보십시오. 이를 사용하는 가장 좋은 방법은 각 업데이트에서 쿼리 캐시가 정리되기 때문에 테이블을 자주 업데이트하지 않는 것입니다. 따라서 업데이트가 적을수록 MySQL이 쿼리를 캐시 할 가능성이 높아지고 결과가 더 빠를 것입니다.

위의 정보가 도움이 되었기를 바랍니다.

+0

좋은 지적. 명확히하기 위해 REGEXP는 성능 향상을 위해 LIKE보다 좋을 것입니다. 쿼리 캐시는 검색이 동일한 경우에만 도움이됩니다. – Ami

관련 문제