2011-05-05 4 views
2

ID가 범위로, 코드가 해시로 분할 된 테이블이 있습니다 (둘 다 정수입니다). 30 개의 파티션, 각각 4 개의 해시 하위 파티션, 총 120 개의 하위 파티션.MySQL에서 쿼리의 하위 파티션을 무시합니다.

혼자 ID에 선택을 할 경우, 계획을 설명은 제대로 만 파티션에 관련된 &에 서브를 치기 있다고 보여줍니다 (4) 나는 ID + 코드에 선택을 할 경우, 계획 프로그램을 설명

그것은 올바르게 관련된 하나 개의 특정 하위 분할로 내려 치기 있다는 (1)

그러나이

...

나 혼자 코드에 선택을 할 경우, 계획은 MySQL이 전체 테이블을하고 있음을 보여주는 것 같다 설명 오라클과 같이 행동하고 각각의 하나의 하위 파티션 만 스캔하는 대신 (120 개의 파티션) 스캔 관련성이있는 파티션 (총 30 개).

MySQL이 전체 파티션을 제거하지 못할 때 서브 파티션 프 루닝을 활용하려면 특별한 것을해야합니까? 또는 MySQL (5.1 이상)이 자체적으로 하위 파티션을 사용하는 것을 지원하지 않습니까?

+0

어떤 엔진 유형을 사용하고 있습니까? – Johan

+0

InnoDB – Bitbang3r

+0

매우 흥미 롭습니다. innoDB가 해시 키를 사용하지 않기 때문에 나는 혼란 스러웠다. 그러나 B + 트리에 저장된 계산 된 해쉬를 의미하는 것 같다. – Johan

답변

0

답변을 찾았습니다. MySQL 5.5 이상에서만 주 파티션 값과 별도로 하위 파티션을 사용할 수 있습니다. 요즈음, 내가 읽고있는 MySQL 문서의 버전을주의 깊게 읽는 것을 잊지 않을 것이다.

최종 예 :

A의 범위로 분할하고 쿼리 1

B.

에 의해 해시 subpartitioned 가정하자 '표'? '표 및 A = B = C와 선택 * =? ":

  • MySQL 5.1 이상에서 예상대로 작동합니다. MySQL은 A의 값을 포함하지 않는 범위와 연관된 파티션을 무시하고 B의 값과 상관되지 않은 서브 파티션을 무시합니다. 최악의 경우 단일 파티션의 단일 하위 파티션에있는 행만 무차별 검색합니다.

    • 이 MySQL을 5.5 및 최신에서 예상 작동 할 수 있습니다으로 :

    질의 2 : "? B는 = 및 C는 = 곳 테이블에서 선택". 오라클이 제대로 작동했다면 최악의 경우 각 파티션 범위에서 단일 하위 파티션을 검색합니다. 분할 영역이 20 개이고 하위 분할 영역이 4 개라면 최악의 경우 20 개의 하위 분할을 통해 무차별 대항 검색을 수행합니다.

  • MySQL 5.1에서는 예상대로 작동하지 않습니다. 80 개 하위 분할 영역을 하나씩 반복하며 기본적으로 전체 테이블 스캔을 수행합니다.

관련 문제