2012-08-28 2 views
1

내가 3 열 인덱스 MyISAM 테이블,효율성

create table t (
    a int, 
    b int, 
    c int, 
    index abc (a, b, c) 
) engine=MyISAM; 
질문은

같은이있는 경우, 다음 쿼리는 완전히 인덱스 활용할 수 있습니다 :

select * from t where a=1 and c=2; 

즉, 인덱스가 b-tree임을 고려하면 MySQL은 중간에 열을 건너 뛰고 첫 번째 열과 마지막 열을 빠르게 검색 할 수 있습니까?

EXPLAIN이 색인이 사용된다는 것을 보여주고있는 것 같습니다. 그러나 Extra는 다음과 같이 말합니다. Using where; Using index 나는 이것이 실제로 무엇을 의미하는지 전혀 모릅니다.

답변

3

대답은 "아니오"입니다.

MySQL의 문서

인덱스를 사용하는 방법에 대한 매우 분명하다 : 테이블이 다중 컬럼 인덱스를 가지고

경우, 인덱스의 가장 왼쪽에 접두사 행을 찾기 위해 최적화 할 수 있습니다. 예를 들어, (col1, col2, col3)에 3 열 인덱스가있는 경우 (col1), (col1, col2) 및 (col1, col2, col3)에 대한 검색 기능이 있습니다. (http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html)

"a = 1"에 대해 색인이 사용됩니다. 일치하는 모든 레코드가로드되어 "c = 2"가 참인지 확인합니다. 필터는 인덱스와 명시 적 레코드 필터링의 조합을 사용하여 종료됩니다.

  • (A, B, C)
  • (B, A, C)
  • : 두 컬럼의 모든 조합을 처리하려면 그런데

    는, 여러 인덱스를 필요 (c, b, a)
0

WHERE 절의 모든 부분에 대해 인덱스를 사용하는 경우에도 은 열이 NULL 일 수있는 경우를 참조하십시오. MySQL 문서 당으로

은, 위의 문은 테이블의 열은 null이 될 수 있음을 명확히하고, 따라서 그것은 WHERE 절에 필드에 인덱스를 덮고있다하더라도뿐만 아니라 using where을 말한다.

http://dev.mysql.com/doc/refman/5.1/en/explain-output.html#explain-extra-information

+0

감사 합니다만, 아니요, 제 경우에는 아무 것도 NULL이 될 수 없습니다. 그래서 'where using'은 단순히 내 색인을 완전히 사용할 수 없다는 것을 의미합니다. – mojuba