2009-12-22 6 views
2

내 MySQL 쿼리에서 EXPLAIN 명령을 실행할 때 :데이터베이스 - 여러 열에 대한 인덱스

EXPLAIN SELECT colZ FROM table1, table 2 
WHERE table1.colA = table2.colA 
AND table1.colB = table2.colB 
AND table1.colC = X 

EXPLAIN 명령은 다음과 같은 내용을 포함하고 있습니다 :

colA, colB, colC 

그러나 실제 키는 colA

: 이것은 내가 세 개의 결합 된 컬럼 모두에 대해 색인을 작성해야 함을 의미합니까? 색인 (colA, colB, colC)?

+0

내가 추가하는 것을 잊어 버렸습니다.이 쿼리는 데이터베이스에서 실행되는 기본 쿼리이므로 매우 빠르게 실행해야합니다. – Timk

답변

1

그래, 난 당신이 커버링 인덱스를 만들 경우에는 결합 인덱스

+0

결합 된 색인을 만드는 데 부정적인 점이 있습니까? – Timk

+1

사용되지 않는 경우에만 ... –

+0

모든 추가 색인은 삽입/삭제에 약간의 오버 헤드를 추가합니다. 비 PK 컬럼의 인덱스는 갱신에 약간의 오버 헤드를 추가 할 수도 있습니다. –

1

을 만들 권 해드립니다 것 optimzer를 위해. 귀하의 경우에는 WHERE 조항 (색인은 colA, colB, colCtable1, 다른 하나는 colA, colBtable2)에있는 열을 커버해야합니다.

오버 헤드의 일정 금액을 필요로이 지수/인덱스를 Mantaining하지만, 장점이 outweight 여부를 별도의 유지 보수가 사용자의 설정에 해당 될 것입니다 (삽입 대에 select etc.etc.)

2

쿼리를 보면, 당신은 성능을 얻을 것이다 :

표 2에

지수 (COLA, COLB)

이 인덱스가 ColZ의 인덱스 만 조회 수 1

테이블에

지수 (COLA, COLB, COLC, ColZ) v. fas이어야합니다. t

0

올바른 대답은 다양한 열의 선택성에 달려 있습니다. 특히 table1.col1C에는 몇 가지 값이 있습니까? 전체 테이블에 'M'및 'F'와 같은 총 두 개의 값이있는 경우 조합 된 인덱스에 포함하지 않아도됩니다 (단, 조합 된 인덱스에 포함되지 않은 경우). col1C 테이블 2에 행이 있기 때문에 table1.col1C의 인덱스를 사용하면 빠른 결과를 얻을 수 있습니다.

옵티마이 저는 조인을 수행하지 않고 table1에서 3 개의 행을 찾은 다음 3 개를 조인 할 수 있습니다 테이블 2에서 일치하는 행을 얻으려면 매우 빠르다.

옵티마이 저가 작동하는 방법에 대한 광범위한 지식과 데이터 집단에 대한 광범위한 분석을 배제하면 몇 가지 대안을 시도하고 실행하는 것이 더 나을 것이다 벤치 마크.

다음은 좋은 소식입니다. 나중에 언제든지 색인 디자인을 변경할 수 있습니다.

관련 문제