2016-10-06 3 views
0

내가 최적화하려고하는 MySQL에 대한 쿼리가 있습니다. 인덱스가 있고 1000 개 미만의 고유 값을 가진 varchar 열 x (및 기타 몇 개)가있는 수십만 개의 행이있는 테이블 t가 있습니다. 특정 정규 표현식과 일치하는 모든 구별되는 x를 얻으려고합니다. 이것은이를 공식화하는 정직 방법 :정규식 쿼리 최적화

SELECT DISTINCT x 
FROM t 
WHERE x REGEXP 'someregexp' 

그러나 정규 표현식을 사용하는 경우 MySQL이 완전히 인덱스를 무시하는 것처럼 보인다, 그래서 몇 초 정도 걸립니다. 고유 값이 매우 적기 때문에 쿼리가 인덱스를 사용하여 고유 값을 가져온 다음 정규식을 사용하여 그 결과를 필터링하는 경우이 값을 처리하는 것이 꽤 빠를 것입니다. 그러나 이것이 지금은 그렇지 않은 것 같습니다 그것은 1 초 이내에 실행할 수 있어야하기 때문입니다.

그런 식으로 MySQL 쿼리 최적화 프로그램에 힌트를 줄 수있는 방법이 있습니까? 그것은 단지에 수행해야하는 경우 빠르고 정규 표현식을 (

SELECT d.x 
FROM (SELECT DISTINCT x FROM t) d 
WHERE d.x REGEXP 'someregexp' 

처음 (인덱스 빠르다) 별개의 필터링을 수행해야합니다 이런 식으로 다음을 수행하십시오

+0

는 "색인" -'SHOW CREATE TABLE'을 제공해주세요. –

답변

0

어쩌면이 같은 시도 몇 가지 별개의 값).

0

계획 A :

SELECT x 
    FROM t 
    GROUP BY x 
    HAVING x REGEXP 'someregexp'; 

(하위 쿼리 접근 방식처럼이, 임시 테이블을 작성해야하고, 읽지 않습니다.)

플랜 B :INDEX(x)를 추가하고 인덱스를 통해 뛰어 넘을 수있는 새 버전의 MySQL을 준비하십시오. (MRR, 5.6.10 참조) 참고 : 서브 쿼리 접근법에도 도움이된다.

계획 C : 플랜 A와 플랜 모두 B.를 수행

0

MySQL이 구체화 된 뷰를 지원하거나 어떻게 그들이 테이블에 대한 변경 사항을 느려질 수 있습니다 우려로이 될 것 '환영'하는 경우 나도 몰라 극적으로 (**). 그러나 요약 테이블을 유지 보수하는 기본 테이블에서 두 개의 트리거와 결합 된 고유 한 값을 보유하는 요약 테이블을 제거 할 수 있다고 생각합니다. (INSERT에서는 아직 요약 테이블에없는 테이블 만 추가하면됩니다. DELETE 명령을 사용하면 마지막 테이블을 삭제했는지 확인해야하며, 요약 테이블에서도 테이블을 삭제하면 확인해야합니다.) UPDATE 두 가지를 모두 확인해야합니다).

당신이 이미 가지고있는 인덱스를 가지고 있다면, 이것은 너무 성가신 IMHO가 아니어야하고, 요약 테이블에 약 1000 개의 값만 있기 때문에 정규 표현식이 훨씬 더 빠를 것으로 기대합니다.

은 (** :에 많이 의존이 것은 당신의 "뷰"완전히 기본 테이블에 대한 모든 변화와 갱신되는 경우, 나는 의심이 허용 될 것입니다 얼마나 "스마트")