2012-12-08 4 views
10

클러스터 된 인덱스가 작동하는 방식에 대해 모두 읽고있어, 내 애플 리케이션에 도움이 될 것이라고 생각합니다. 기본 키는 자동으로 클러스터 된 인덱스라는 것을 알고 있지만 비 기본 키 열에 클러스터 된 인덱스를 추가하는 방법은 무엇입니까?Mysql 클러스터형 인덱스는 어떻게 만듭니 까?

e.e. 사용자 게시물 용 데이터 저장소 각 게시물에는 ID가 있지만 사용자 ID도 있지만 사용자가 여러 번 게시 할 수 있으므로 user-id는 기본 키가 아닙니다. 어떻게 클러스터 된 인덱스를 user-id에 추가 할 것인가?

답변

13

Clustered and Secondary Indexes에 따르면 테이블 당 하나의 클러스터 된 인덱스 만 가질 수 있습니다.

클러스터 된 인덱스 이외의 모든 인덱스를 보조 인덱스라고합니다.

테이블에 기본 인덱스가없고 다른 고유 인덱스가 있으면이 인덱스가 클러스터형 인덱스로 사용됩니다.

테이블에 PRIMARY KEY를 정의하지 않으면, MySQL은 모든 키 열이 NOT NULL이고 InnoDB가 클러스터 된 인덱스로 사용하는 첫 번째 UNIQUE 인덱스를 찾습니다.

따라서 클러스터 된 인덱스는 직접 추가하지 않지만 MySQL은 테이블의 기본 인덱스 또는 첫 번째 고유 인덱스를 클러스터형 인덱스로 선택합니다.

7

@Olaf가 설명하는 것처럼 InnoDB는 클러스터 된 인덱스 (기본 키가 없으면 기본 키 또는 첫 번째 고유 인덱스)를 선택하고, 기본 키가 없으면 첫 번째 고유 인덱스 (두 개 중 하나가없는 경우 숨겨진 열)를 선택합니다).

당신은 클러스터 된 인덱스와 고유하지 않은 열을 원한다면, 당신은 고유 키로 post_id을 정의하고 user_idpost_id 클러스터 된 인덱스로 선정 될 기본 키의 조합을 만들 수 :

CREATE TABLE Post 
(post_id INT NOT NULL AUTO_INCREMENT 
, user_id INT NOT NULL 
--- other columns 
, CONSTRAINT Post_PK 
    PRIMARY KEY (user_id, post_id)  -- your clustered index 
, CONSTRAINT post_id_UQ 
    UNIQUE (post_id)    -- you still want uniqueness for the `post_id` 
) ENGINE = InnoDB ; 

이것이 좋은 생각인지 여부는 응용 프로그램, 데이터 볼륨 및 쿼리에 따라 다릅니다. 일반적으로 클러스터 된 키의 최상의 속성은 고유하고 좁고 정적이며 계속 증가합니다. 이것이 자동 증가 열이 가장 좋은 이유입니다.

(user_id, post_id) 같은 클러스터 키가있다 (같은 문제가 이노의 클러스터 인덱스에 99 %를 적용들은 SQL-Server에 대한 때문에 중지하지 마십시오) Ever-increasing clustering key - the Clustered Index Debate..........again!The Clustered Index Debate Continues...는 : 킴벌리 L. 트립의 블로그 기사에 대해 읽기 처음 3 가지 속성이 있지만 그 수가 계속 늘지는 않습니다. 이로 인해 CI가 단편화되고 테이블에 삽입되는 속도가 느려질 수 있습니다.

WHERE user_id = ? 조건 또는 범위 조건 WHERE user_id BETWEEN ? AND ? 또는 GROUP BY user_id 그룹을 갖는보다 효율적인 쿼리가 원하는 데이터가 클러스터 된 인덱스에서 한 곳에서 필요한 순서로 발견되므로보다 효율적인 쿼리가 생성됩니다.

귀하의 경우에 가장 적합한 것을 선택하는 것이 좋습니다.


테이블에 여러 개의 클러스터 된 인덱스를 허용하는 MySQL 변형 인 TokuDB도 있습니다.기사의 세부 정보 : Introducing Multiple Clustering Indexes

1

잘못된 질문을하는 것이 좋습니다.

한 가지 다른 질문은 "현재 내 PRIMARY KEY을 제거하여이 '클러스터 된'다른 것을 만들 수 있습니까?" 종종 AUTO_INCREMENT은 제거하거나 간단한 INDEX으로 바꿀 수 있습니다.

더 많은 질문은 "이 SELECT ...에 대한 최적의 색인은 무엇입니까?"입니다. 다른 사람들은 두 번째 클러스터 된 인덱스가 기본 MySQL에 대한 질문에서 제외되었으므로 다음 선택은 무엇입니까? SELECT을 모른 채 대답 할 수 없습니다. 그러나 my Index CookbookSELECTs이라는 큰 질문에 답합니다.