2016-10-12 2 views
2

두 개의 파티션이있는 테이블이 있습니다. 파티션은 pactive = 1pinactive = 0입니다. 나는 두 개의 파티션이별로 이득이되지 않는다는 것을 이해하지만, 하나의 파티션에서 잘라내어로드하고 일반 파티션을 다른 파티션에 삽입하는 데 사용했습니다.MySQL의 파티션 테이블에 대한 인덱스

인덱스를 만들 때 문제가 발생합니다.

쿼리는이 방법을

select partitionflag,companyid,activityname 
from customformattributes 
where companyid=47 
     and activityname = 'Activity 1' 
     and partitionflag=0 

만든 인덱스를 간다 -

create index idx_try on customformattributes(partitionflag,companyid,activityname,completiondate,attributename,isclosed) 

위의 쿼리에서 입수해온됩니다 약 200000 기록이 있습니다. 그러나 앞서 언급 한 색인과 함께 검색어는 30 초 이상 걸립니다. 그런 긴 시간 동안의 이유는 무엇입니까? 또한, 위에서 언급 한 인덱스에서 partitionflag를 제거하면 인덱스가 사용되지 않습니다.

그리고

  1. 에도 파티션을 사용할 수와 함께, 옵티마이, 인덱스 정의에 언급 된 요구 파티션이 필요 있도록 단지 올바른 ---- 필요한 파티션 안타, 이해는 무엇입니까? 이해에

어떤 아이디어이

+0

설명 출력이 없으면 추측하면됩니다. – Shadow

+0

안녕, 계획 상세 정보를 검색 할 ID - 1 SELECT_TYPE - SIMPLE 테이블 - customformattributes 유형 - 심판 이 possible_keys - idx_try 키 - idx_try 있는 key_len - 213 심판 - const를, CONST, const를 행 - 247892 필터링 - 100.00 추가 - Using using; 인덱스 –

+0

사용 특히 쿼리 실행 계획에 잘못된 것이 있다고 생각하지 않습니다. 당신은 큰 결과를 가지고 있습니다. 결과 집합을 줄이고 쿼리 성능을 그렇게 확인 했습니까? – Shadow

답변

0

당신은 그것의 열을 재정렬하여 인덱스를 최적화 할 수 있습니다 매우 도움이 될 것입니다. 일반적으로 인덱스의 열은 카디널리티에 따라 정렬됩니다 (가장 높은 순서에서 시작하여 가장 낮은 순서로). 카디널리티는 주어진 열의 데이터의 고유성입니다. 그래서 당신의 경우에는 customformattributes 테이블에 companyid의 변형이 많이있는 반면 partitionflag는 2의 카디널리티를가집니다 (이 열에 대한 모든 옵션이 1과 0 인 경우). 쿼리는 먼저 partitionflag = 0 인 모든 행을 필터링 한 다음 회사 ID별로 필터링합니다. 인덱스에서 partitionflag를 제거 할 때 쿼리는 인덱스를 사용하지 않고 전체 테이블 검색을하는 것이 더 빠를 것이라고 옵티마이 저가 결정할 수 있기 때문에 쿼리에서 인덱스를 사용하지 않았습니다 (대부분의 경우 최적화 프로그램이 올바르지 않은 경우)

주어진 쿼리

:

select partitionflag,companyid,activityname 
from customformattributes 
where companyid=47 
    and activityname = 'Activity 1' 
    and partitionflag=0 

는 다음 인덱스가 더 나을 수있다 (그러나 물론 :

create index idx_try on customformattributes(companyid,activityname, completiondate,attributename, partitionflag, isclosed) 

쿼리는 다음과 같은 규칙이 충족되어야합니다 인덱스 사용하는 경우 - 가장 왼쪽 열을 색인에 where 절에 있어야합니다 ... mysql 버전에 따라 추가 쿼리 요구 사항이 필요할 수 있습니다. 예를 들어 mysql의 이전 버전을 사용하는 경우 - 인덱스에 나열된 것과 동일한 순서로 where 절에서 열을 정렬해야 할 수 있습니다. 마지막 버전의 mysql에서 쿼리 최적화 프로그램은 where 절에있는 컬럼을 올바른 순서로 정렬해야한다.

SELECT 쿼리는 200KB 행을 반환하고 인덱스가 주어진 쿼리에 적합하지 않을 수 있으므로 30 초 이상 걸렸습니다.

분할에 관한 두 번째 질문은 공통적 인 규칙은 분할하는 열이 표의 모든 UNIQUE 키의 일부 여야한다는 것입니다 (기본 키는 정의에 따라 고유 키이기 때문에 열이 있어야 함). 또한 PK에 추가됨).테이블 구조 및 논리를 사용하면 테이블의 모든 UNIQUE 인덱스에 분할 열을 추가 할 수 있습니다. 그런 다음 테이블을 추가하고 테이블을 분할합니다. 파티셔닝이 올바르게 이루어지면 파티셔닝 프 루닝을 활용할 수 있습니다. SELECT 쿼리는 주어진 데이터가 저장된 파티션에서만 데이터를 검색합니다 (그렇지 않으면 모든 파티션에서 찾습니다).

여기에서 분할 : https://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

+0

지연된 응답에 대한 사과 ... 귀하의 설명은 인덱스를 더 잘 이해할 수 있도록 도왔습니다 .. 감사합니다! –

+0

이 질문을 통해이 문제를 해결할 수 있기를 바랍니다. – krasipenkov

+0

답변 중 하나를 수락 할 수 있습니까 (문제가 없다면 답안을 남겨 둘 수 없음). – krasipenkov

0

디스크가 느리기 때문에 쿼리가 느립니다. 인덱스를 설계 할 때

리티는 중요하지 않습니다.

해당 검색어에 대한 최적의 인덱스가 SELECT 어딘가에 한 모든 열을 포함하기 때문에 그것은 "덮고"있다

INDEX(companyid, activityname, partitionflag) -- in any order 

이다. 이것은 EXPLAIN에서 "색인 사용"으로 표시됩니다. 다른 3 열을 떠나

는 빠르게 디스크 오프 더 적은을 읽을 필요하기 때문에 쿼리를합니다.

당신이 다음 인덱스는 더 이상 최적하지 않을 수 있습니다 (ORDER BY를 추가, '>'에 등을 '='에서 변경 열을 추가) 쿼리에 어떤 변경 한 경우.

"는 언급 인덱스에서 partitionflag를 제거하는 경우 또한, 인덱스도 사용되지 않습니다." - 그것은 더 이상 "덮음"이 아니기 때문입니다. "커버"데이터를 검색 할 수있는 방법 인 대 -

인덱스가 사용될 수있는 두 가지 방법이 있음을 알아 두셔야합니다. "덮음"색인이없는 경우 옵티마이 저는 색인 사용과 색인 및 데이터 간 수신 거부 중에서 단순히 색인을 무시하고 표를 검색하는 것 중에서 선택합니다.

+0

지연된 응답에 대한 사과 ... 귀하의 설명은 색인을 더 잘 이해하도록 도왔습니다 .. 감사합니다! –