@Olaf가 설명하는 것처럼 InnoDB는 클러스터 된 인덱스 (기본 키가 없으면 기본 키 또는 첫 번째 고유 인덱스)를 선택하고, 기본 키가 없으면 첫 번째 고유 인덱스 (두 개 중 하나가없는 경우 숨겨진 열)를 선택합니다).
당신은 클러스터 된 인덱스와 고유하지 않은 열을 원한다면, 당신은 고유 키로 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 ;
이것이 좋은 생각인지 여부는 응용 프로그램, 데이터 볼륨 및 쿼리에 따라 다릅니다. 일반적으로 클러스터 된 키의 최상의 속성은 고유하고 좁고 정적이며 계속 증가합니다. 이것이 자동 증가 열이 가장 좋은 이유입니다.
이
(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