InnoDB 는 반드시 색인 에 메 인 키 를 추가 합 니까?
제 가 코드 를 봤 을 때 색인 끝 이 메 인 키 였 다 면 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 가 색인 을 만 들 때 업무 가 요구 하 는 색인 필드 뒤에 메 인 키 필드 를 추가 하 는 것 은 손실 이 없 지만 의외 의 놀 라 움 을 줄 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.