[SQL] MySQL은 어떻게 클러스터 된 인덱스를 만들려면 어떻게해야합니까?
SQLMySQL은 어떻게 클러스터 된 인덱스를 만들려면 어떻게해야합니까?
나는 색인 작업을 클러스터, 그들이 내 응용 프로그램에 도움이 될 것이라고 생각하는 방법에 대해 모두 읽고 있어요. 그 기본 키가 자동으로 클러스터 인덱스 있습니다 이해하지만 어떻게 당신은 기본 키가 아닌 컬럼에 클러스터 된 인덱스를 추가?
즉 사용자 게시물에 대한 데이터 저장소. 각 포스트는 ID가 아니라 사용자 ID를 가지고 있지만, 사용자가 여러 번 게시 할 수 있기 때문에, 사용자 ID는 기본 키가 아닙니다. 어떻게 사용자 ID에 클러스터 된 인덱스를 추가, 심지어 좋은 아이디어이다까요?
해결법
-
==============================
1.클러스터 및 보조 인덱스에 따르면, 당신은 테이블 당 하나의 클러스터 된 인덱스를 가질 수 있습니다.
클러스터 및 보조 인덱스에 따르면, 당신은 테이블 당 하나의 클러스터 된 인덱스를 가질 수 있습니다.
테이블이 더 차 인덱스하지만 다른 고유 인덱스가없는 경우,이 클러스터 된 인덱스로 사용됩니다.
그래서, 난 당신이 클러스터 된 인덱스를 직접 추가하지 않는 것이, 결론,하지만 MySQL은 중 기본 또는 클러스터 된 인덱스와 테이블의 첫 번째 고유 인덱스를 선택합니다.
당신이 기본 또는 고유 인덱스를 정의하지 않은 경우, MySQL은 인덱스 자체를 생성
-
==============================
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.난 당신이 틀린 질문을하는 것이 좋습니다.
난 당신이 틀린 질문을하는 것이 좋습니다.
"나는이 다른 것은 '클러스터'를 할 수 있도록 내 현재의 기본 키를 제거 할 수 있습니까?"하나 개의 대안 질문은 종종 AUTO_INCREMENT이 제거 또는 간단한 인덱스로 설정할 수 있습니다.
더 많은 가능성이 질문은 "이 SELECT ...?에 대한 최적의 인덱스 무엇"이다. 다른 사람은 다음의 선택은 무엇인가, 그래서 두 번째 클러스터 된 인덱스가 기본 MySQL의에 대한 질문을 밖으로 지적했다? 나는 선택을 모른 채 대답하지 수 있습니다. 그러나 내 색인 요리 책에 select의 큰하자에 대한 질문에 대한 대답.
-
==============================
4.당신이 InnoDB의 테이블에 대한 기본 키를 정의 할 때, MySQL은 클러스터 된 인덱스와 기본 키를 사용합니다.
당신이 InnoDB의 테이블에 대한 기본 키를 정의 할 때, MySQL은 클러스터 된 인덱스와 기본 키를 사용합니다.
당신이 테이블에 대한 기본 키가없는 경우, MySQL은 모든 키 열이 NULL NOT 어디 최초의 UNIQUE 인덱스를 검색하고 클러스터 된 인덱스로이 UNIQUE 인덱스를 사용합니다.
이노 디비 테이블 기본 키 또는 적합한 UNIQUE 인덱스가없는 경우, MySQL은 내부적으로 행 ID 값을 포함하는 합성 열 GEN_CLUST_INDEX라는 숨겨진 클러스터 된 인덱스를 생성한다.
from https://stackoverflow.com/questions/13779138/mysql-how-do-you-create-a-clustered-index by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 절에 SQL에 튜플을 사용하여 (0) | 2020.07.03 |
---|---|
[SQL] 오라클 DB : java.sql.SQLException의 : 폐쇄 연결 (0) | 2020.07.03 |
[SQL] SQL : 다 대다 테이블 및 쿼리 (0) | 2020.07.03 |
[SQL] SQL Server에 대한 CONCAT_WS () (0) | 2020.07.03 |
[SQL] 예외 : SQLException :하는 executeQuery 방법은 업데이트를 사용할 수 없습니다 (0) | 2020.07.03 |