복붙노트

[SQL] MySQL은 어떻게 클러스터 된 인덱스를 만들려면 어떻게해야합니까?

SQL

MySQL은 어떻게 클러스터 된 인덱스를 만들려면 어떻게해야합니까?

나는 색인 작업을 클러스터, 그들이 내 응용 프로그램에 도움이 될 것이라고 생각하는 방법에 대해 모두 읽고 있어요. 그 기본 키가 자동으로 클러스터 인덱스 있습니다 이해하지만 어떻게 당신은 기본 키가 아닌 컬럼에 클러스터 된 인덱스를 추가?

즉 사용자 게시물에 대한 데이터 저장소. 각 포스트는 ID가 아니라 사용자 ID를 가지고 있지만, 사용자가 여러 번 게시 할 수 있기 때문에, 사용자 ID는 기본 키가 아닙니다. 어떻게 사용자 ID에 클러스터 된 인덱스를 추가, 심지어 좋은 아이디어이다까요?

해결법

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

    1.클러스터 및 보조 인덱스에 따르면, 당신은 테이블 당 하나의 클러스터 된 인덱스를 가질 수 있습니다.

    클러스터 및 보조 인덱스에 따르면, 당신은 테이블 당 하나의 클러스터 된 인덱스를 가질 수 있습니다.

    테이블이 더 차 인덱스하지만 다른 고유 인덱스가없는 경우,이 클러스터 된 인덱스로 사용됩니다.

    그래서, 난 당신이 클러스터 된 인덱스를 직접 추가하지 않는 것이, 결론,하지만 MySQL은 중 기본 또는 클러스터 된 인덱스와 테이블의 첫 번째 고유 인덱스를 선택합니다.

    당신이 기본 또는 고유 인덱스를 정의하지 않은 경우, MySQL은 인덱스 자체를 생성

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

    2.@Olaf 설명 된 바와 같이 (이들의 존재하지 않는 경우는 기본 키 또는 숨겨진 열이없는 경우 기본 키, 또는 제 1 고유 인덱스)되는 열 또는 열 조합 이노 선택한다면은 클러스터 된 인덱스 될 것이다.

    @Olaf 설명 된 바와 같이 (이들의 존재하지 않는 경우는 기본 키 또는 숨겨진 열이없는 경우 기본 키, 또는 제 1 고유 인덱스)되는 열 또는 열 조합 이노 선택한다면은 클러스터 된 인덱스 될 것이다.

    당신은 클러스터 된 인덱스와 고유하지 않은 열을 원한다면, 당신은 고유 키로 post_id를 정의하고 USER_ID의 조합을하고 클러스터 된 인덱스로 선정 될 기본 키를 POST_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 ;
    

    이것이 좋은 생각인지 여부는 응용 프로그램, 데이터 볼륨과 당신이 가지고있는 쿼리에 따라 달라집니다. 일반적으로 클러스터 키의 최고의 특성은 고유 좁고, 정적 및 계속 증가하고있다. 자동 증가 열이 최고입니다 이유입니다. 킴벌리 L. 트립의 블로그 기사에 대한 읽기 : 계속 증가하는 클러스터링 키를 - 클러스터 된 인덱스 토론을 .......... 다시! 및 클러스터 된 인덱스 토론은 (멈추지 말고 그들이 SQL-Server에 대한 때문에, 같은 문제는 이노의 클러스터 인덱스에 99 %를 적용) ... 계속

    제 (USER_ID, post_id를) 같은 클러스터 키는 처음 3 개 특성을 가지고 있지만, 계속 증가하지 않습니다. 이것은 테이블에 CI의 분열 가능성이 느린 삽입에 발생합니다.

    그것은 그러나 WHERE USER_ID =이보다 효율적인 쿼리가 발생합니다? 조건이나 범위 조건 WHERE USER_ID BETWEEN? 및? 원하는 데이터를 한 곳에서하고 필요한 순서로 클러스터 된 인덱스에서 찾을 수 또는 GROUP BY는 그룹을 USER_ID.

    난 당신이 경우에 가장 적합한 선택 시험을 제안한다.

    테이블에 여러 개의 클러스터 된 인덱스를 허용하는 MySQL의 변형, TokuDB도있다. 그 문서의 세부 사항 : 소개 다중 클러스터링 인덱스

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

    3.난 당신이 틀린 질문을하는 것이 좋습니다.

    난 당신이 틀린 질문을하는 것이 좋습니다.

    "나는이 다른 것은 '클러스터'를 할 수 있도록 내 현재의 기본 키를 제거 할 수 있습니까?"하나 개의 대안 질문은 종종 AUTO_INCREMENT이 제거 또는 간단한 인덱스로 설정할 수 있습니다.

    더 많은 가능성이 질문은 "이 SELECT ...?에 대한 최적의 인덱스 무엇"이다. 다른 사람은 다음의 선택은 무엇인가, 그래서 두 번째 클러스터 된 인덱스가 기본 MySQL의에 대한 질문을 밖으로 지적했다? 나는 선택을 모른 채 대답하지 수 있습니다. 그러나 내 색인 요리 책에 select의 큰하자에 대한 질문에 대한 대답.

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

    4.당신이 InnoDB의 테이블에 대한 기본 키를 정의 할 때, MySQL은 클러스터 된 인덱스와 기본 키를 사용합니다.

    당신이 InnoDB의 테이블에 대한 기본 키를 정의 할 때, MySQL은 클러스터 된 인덱스와 기본 키를 사용합니다.

    당신이 테이블에 대한 기본 키가없는 경우, MySQL은 모든 키 열이 NULL NOT 어디 최초의 UNIQUE 인덱스를 검색하고 클러스터 된 인덱스로이 UNIQUE 인덱스를 사용합니다.

    이노 디비 테이블 기본 키 또는 적합한 UNIQUE 인덱스가없는 경우, MySQL은 내부적으로 행 ID 값을 포함하는 합성 열 GEN_CLUST_INDEX라는 숨겨진 클러스터 된 인덱스를 생성한다.

  5. from https://stackoverflow.com/questions/13779138/mysql-how-do-you-create-a-clustered-index by cc-by-sa and MIT license