복붙노트

[SQL] 열 인덱스 대 복합 VS MySQL의 커버링

SQL

열 인덱스 대 복합 VS MySQL의 커버링

다음 쿼리에서

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
  AND   col4='value2'

나는 그들 중 하나는이 쿼리에 2 개 별도의 인덱스 COL3에 하나 col4에 다른, 사용되는이있는 경우?

나는 쿼리의 각 테이블에 대해 하나의 인덱스가 사용되는 곳 읽었다. 즉, 쿼리는 모두 인덱스를 사용 할 방법이 없음을 의미합니까?

둘째, 내가 함께 COL3 및 col4을 모두 사용하여 복합 인덱스를 생성하지만이 성능 악화 될 WHERE 절에서 오직 COL3 사용하는 경우?  예:

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'

마지막으로, 모든 경우에 인덱스를 커버 만 사용하는 것이 좋습니다? 그것은 MYISAM 사이 스토리지 엔진 INNODB의 차이점은 무엇입니까?

해결법

  1. ==============================

    1.피복 률은 지수와 동일하지 않다.

    피복 률은 지수와 동일하지 않다.

    가장 높은 기수와 인덱스입니다. MySQL은 인덱스가 어떤 특성을 가지고있는 통계를 유지합니다. (MySQL의 통계에서 분명로) 가장 차별의 힘이 인덱스가 사용됩니다.

    당신은 부속을 사용할 수 있습니다. 또는 더 나은 COL3 및 col4 모두를 포함하는 복합 인덱스를 사용합니다.

    화합물 인덱스 정확한 용어는 화합물 인덱스 복합 아니다. 복합 인덱스의 가장 왼쪽 부분이 사용됩니다. 인덱스로 정의한다면

    index myindex (col3, col4)  <<-- will work with your example.
    index myindex (col4, col3)  <<-- will not work. 
    

    참조 : http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

    주 당신이 가장 왼쪽 필드를 선택하면, 당신은 당신의 where 절에 인덱스의 일부를 사용하지 멀리 얻을 수 있습니다. 우리는 복합 인덱스가 상상

    Myindex(col1,col2)
    
    SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index
    SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  
    

    이유는이 작품이 첫 번째 쿼리가 포함 인덱스를 사용하고 해당에 스캔을 수행한다는 것이다. 두 번째 쿼리에 필요한 테이블에 액세스하고 그 이유를 스캐닝 지수는 이해가되지 않습니다하지만. 이것은 InnoDB만을 작동합니다.

    코팅이 지수는 무엇입니까 쿼리에서 선택한 모든 필드는이 경우 이노 (하지의 MyISAM) 테이블의 데이터를 읽을 있지만 인덱스의 데이터를 사용 않습니다에, 인덱스에 포함되는 경우 커버링 인덱스는 경우를 말한다 상당히 최대 속도 고르다. 이노에 기본 키가 모든 보조 인덱스에 포함되어 있습니다, 그래서 방법으로 모든 보조 인덱스는 복합 인덱스입니다. 당신은 이노에서 다음 쿼리를 실행하면 것을이 수단 :

    SELECT indexed_field FROM table1 WHERE pk = something
    

    MySQL은 항상 포함하는 인덱스를 사용하고 실제 테이블에 액세스하지 않습니다.

  2. ==============================

    2.나는 완전성에 대한 요한의 답변을 upvoted,하지만 난 그가 보조 인덱스에 대한 올바르지 및 / 또는 혼동이다 만드는 다음 문을 생각;

    나는 완전성에 대한 요한의 답변을 upvoted,하지만 난 그가 보조 인덱스에 대한 올바르지 및 / 또는 혼동이다 만드는 다음 문을 생각;

    Note that in InnoDB the primary key is included in all secondary indexes, 
    so in a way all secondary indexes are compound indexes.
    
    This means that if you run the following query on InnoDB:
    
    SELECT indexed_field FROM table1 WHERE pk = something
    
    MySQL will always use a covering index and will not access the actual table.
    

    나는 차 키가 보조 인덱스에 포함되어 동의하는 동안, 나는 여기에 지정된 SELECT 질의에 "항상 포함하는 인덱스를 사용합니다"MySQL이 동의하지 않습니다.

    전체 인덱스 "스캔"항상이 경우에 요구되는 이유, 노트 참조하십시오. 이것은 "추구"작업과 동일하지 않으며, 대신 보조 인덱스 내용의 100 % 검사입니다. 이는 보조 인덱스는 기본 키에 의해 정렬되지 않은 사실에 기인한다; 이 "indexed_field"으로 정렬됩니다 (그렇지 않으면 인덱스 많이 사용하지 않을 것입니다!).

    이 후자의 사실에 비추어, 보조 색인에서 "실제 테이블에서"하지 indexed_field 추출 후, 거기는 "추구"기본 키에 더 효율적입니다 경우, 그리고 것입니다.

  3. ==============================

    3.이것은 내가 많이 듣고 문제로 인해 주변의 많은 혼란이 질문입니다 :

    이것은 내가 많이 듣고 문제로 인해 주변의 많은 혼란이 질문입니다 :

    의 MyISAM은 나이가 있지만 입증 된 것입니다. 테이블 형식, 데이터, 인덱스 - : MyISAM 테이블의 데이터는 세 가지에 대한 파일 사이에 분할됩니다. InnoDB는의 MyISAM에 비해 상대적으로 최신 버전 인 및 거래 안전합니다. 다중 사용자 동시 및 성능을 향상 테이블 로크 반대로 이노도 행 로크를 제공한다. InnoDB는 또한 외래 키 제약 조건이있다. 그 때문에 행 잠금 기능 이노 잘 고부하 환경에 적합하다.

    것들에 대해 확실히, 쿼리 실행을 분석하기 위해 사용 explain_plan에 있는지 확인하십시오.

  4. ==============================

    4.화합물 인덱스는 지수와 동일하지 않다.

    화합물 인덱스는 지수와 동일하지 않다.

  5. from https://stackoverflow.com/questions/8213235/mysql-covering-vs-composite-vs-column-index by cc-by-sa and MIT license