InnoDB 는 반드시 색인 에 메 인 키 를 추가 합 니까?

회전:http://www.penglixun.com/tech/database/will_innodb_store_pk_in_index.html
제 가 코드 를 봤 을 때 색인 끝 이 메 인 키 였 다 면 InnoDB 는 메 인 키 를 추가 하지 않 았 을 것 입 니 다. 색인 끝 이 메 인 키 가 아니라면 메 인 키 를 추 가 했 을 것 입 니 다. 그러나 이것 은 테스트 결과 와 일치 하지 않 습 니 다.
CREATE TABLE t (
  a char(32) not null primary key,
  b char(32) not null,
  KEY idx1 (a,b),
  KEY idx2 (b,a)
) Engine=InnoDB;

일부 데 이 터 를 삽입 하면 idx 1 과 idx 2 두 색인 의 크기 가 같 음 을 볼 수 있 습 니 다.이것 은 idx 1 과 idx 2 의 내부 구조 가 같 기 때문에 idx 1 이 내부 에 (a, b, a) 로 저 장 될 수 없다 는 것 을 의미한다.
 
중점:
따라서 사용자 가 정의 하 는 색인 필드 에 홈 키 의 필드 가 포함 되 어 있 으 면 이 필드 는 더 이상 InnoDB 에 의 해 자동 으로 색인 에 추가 되 지 않 습 니 다. 사용자 의 색인 필드 에 홈 키 필드 가 완전히 포함 되 어 있 지 않 으 면 InnoDB 는 나머지 홈 키 필드 를 색인 끝으로 추가 합 니 다.
따라서 우리 의 최초의 예 에서 idx 1 과 idx 2 두 색인 내부 크기 는 완전히 같 고 차이 가 없다.
마지막 으로 그룹 키 의 예 를 추가 합 니 다.
CREATE TABLE t (
  a char(32) not null,
  b char(32) not null,
  c char(32) not null,
  d char(32) not null,
  PRIMARY KEY (a,b)
  KEY idx1 (c,a),
  KEY idx2 (d,b)
) Engine=InnoDB;

이 표 InnoDB 는 메 인 키 사전 을 자동 으로 보완 합 니 다. idx 1 은 실제 내부 에 (c, a, b) 로 저장 되 고 idx 2 는 실제 내부 에 (d, b, a) 로 저 장 됩 니 다.하지만 이 자동 으로 추 가 된 필드 는 서버 층 이 모 르 기 때문에 MySQL 유 틸 리 티 는 이 필드 의 존 재 를 모 르 기 때문에 검색 이 있다 면:
SELECT * FROM t WHERE d=x1 AND b=x2 ORDER BY a;

사실 내부 에 저 장 된 idx 2 (d, b, a) 는 이 조 회 를 완전히 색인 으로 만 들 수 있 지만 서버 층 이 모 르 기 때문에 최종 적 으로 MySQL 최적화 기 는 idx 2 (d, b) 를 선택 하여 여과 한 다음 에 a 필드 를 정렬 하거나 PK 스 캔 으로 정렬 을 피 할 수 있 습 니 다.
만약 에 우리 가 표 구 조 를 정의 할 때 KEY idx 2 (d, b, a) 로 정의 하면 MySQL 은 (d, b, a) 세 필드 의 색인 에 모두 있다 는 것 을 알 게 될 것 이다. 또한 InnoDB 는 사용자 가 정의 하 는 색인 에 모든 메 인 키 필드 가 포함 되 어 있 고 더 이상 추가 되 지 않 으 며 저장 공간 이 추가 되 지 않 은 것 을 발견 했다.
따라서 모든 DBA 가 색인 을 만 들 때 업무 가 요구 하 는 색인 필드 뒤에 메 인 키 필드 를 추가 하 는 것 은 손실 이 없 지만 의외 의 놀 라 움 을 줄 수 있 습 니 다.

좋은 웹페이지 즐겨찾기