2014-02-14 3 views
0

mysql_query가 있습니다. 색인을 생성 할 항목이 궁금합니다.mysql의 인덱스 열

SELECT count(*) FROM foo WHERE c=5 GROUP BY d 

어쩌면 (c, d) 또는?

다른 비슷한 점이 있습니다.

SELECT count(*) FROM foo WHERE d=6 GROUP BY b 

어쩌면 (d, b) 또는 d일까요?

여기서 또 하나 여기

SELECT a FROM foo WHERE b=5 GROUP BY c 

(A, B, C)?

요점은 3 가지 검색어를 다루는 색인을 만드는 것입니다. 가장 좋은 점은 무엇입니까? 그리고 어떤 열에?

+0

나는 실수로 편집했습니다. – user3184462

+1

왜 단일 색인입니까? 여러 개의 인덱스를 만들지 못하게하는 요인은 무엇입니까? –

+0

인덱스가 모든 것을 커버 할 수 있다면 더 이해할 수있을 것입니다. – user3184462

답변

0

모든 사용 사례를 충당하기 위해 하나 개의 인덱스가 불가능 ..., MySQL의에 대한 전문가가 아니에요.

MySQL은/​​group by order by order by 인덱스를 사용하여 이익을 얻을 수 있습니다. 임시 테이블 인 filesort를 저장하지 않습니다. 내 제안 될 것이다 :

1) (c, d)

2) (d, b)

3) 마지막 (A, B와 C)를 사용할 수 없게 될 것이다 시작될 때문에 와 (열 순서 문제). 적절한 색인은 (b, c, a)입니다.

비트 설명 :

  1. 결과 (이 필요 b) 필터
  2. 주문 색인이 경우 컬럼으로 순서대로 페치하거나 (이것은 그것을 분류 :

    MySQL은 다음을 수행 상기 선택 부에서 열 (그것이)

필요 동일)

  • 창이다하여 c) (기를 필요 매우 중요한 다른 요소는 색인의 선택성입니다. 예를 들어, 50 % true, 50 % false를 가진 boolean이있는 경우, 인덱스 트리를 탐색하는 것보다 전체 테이블을 스캔하는 것이 더 쉽기 때문에 MySQL은 인덱스를 사용하지 않습니다.

  • +0

    .. !! – user3184462

    0

    이 세 가지 쿼리의 경우 a에 하나, b에 하나, c에 하나씩 세 가지 인덱스가 필요합니다. 이들은 복합 색인이 될 수 있으므로 색인의 첫 번째 열로 a,b,c, 'b, c, ', and c, b, . But for each query, you need an index that has the one column in the` 절을 사용할 수 있습니다.

    MySQL은 왼쪽에서 열을 사용합니다. 색인의 열 순서가 중요합니다.

    documentation은 실제로 이것을 매우 잘 설명합니다.

    0

    예를 들어 첫 번째 쿼리 만 고려하십시오. "c"열에 대해서만 색인을 생성 할 수 있습니다. 그러나 "c"에 대한 선택도가 낮 으면 ("c"와 동일한 값을 가진 많은 레코드가 많음) 인덱스에 (c, d)에 복합 인덱스를 만들 수 있으므로 인덱스로 정렬 작업을 피할 수 있습니다. 범위 스캔, 이미 정렬 된 레코드를 가져옵니다. 세 번째 쿼리의 경우 세 개의 열 모두에 인덱스를 만들면 인덱스 액세스 만하는 결과를 얻을 수 있으므로 테이블 액세스는 피할 수 있습니다.

    그러나 쿼리에서 실행 경로를 선택할 때 옵티마이 저가 고려할 변수가 많기 때문에 위의 예제는 몇 가지 간단한 예입니다. 고든 리노 프의 대답은 내 대답보다 더 정확하게 할 수 있도록

    나는