Mysql 인덱스 토론
MySQL에서 인덱스는 스토리지 엔진 수준의 개념입니다. 다양한 스토리지 엔진이 인덱스를 다른 방식으로 구현합니다. 이 기사에서는 주로 MyISAM 및 InnoDB 방식의 인덱스 구현을 설명합니다. .
MyISAM 인덱스 구현
MyISAM 엔진은 B+Tree를 인덱스 구조로 사용하며 리프 노드의 데이터 필드에는 데이터 레코드의 주소가 저장됩니다. 다음 그림은 MyISAM 인덱스의 개략도입니다.
테이블에 총 3개의 열이 있다고 가정합니다. Col1을 기본 키로 사용한다고 가정하면 그림 8은 다음과 같습니다. MyISAM 테이블의 기본 인덱스(기본 키)는 나타냅니다. MyISAM의 인덱스 파일은 데이터 레코드의 주소만 저장하는 것을 볼 수 있습니다. MyISAM에서는 기본 인덱스의 키가 고유해야 하는 반면 보조 인덱스의 키는 반복될 수 있다는 점을 제외하면 기본 인덱스와 보조 인덱스(보조 키) 사이에 구조적 차이가 없습니다. Col2에 보조 인덱스를 생성하면 이 인덱스의 구조는 아래와 같습니다.
도 B+Tree이고 데이터 필드에는 Col2의 주소가 저장됩니다. 데이터 기록. 따라서 MyISAM의 인덱스 검색 알고리즘은 먼저 B+Tree 검색 알고리즘에 따라 인덱스를 검색하는 것입니다. 지정된 Key가 존재하면 해당 데이터 필드의 값을 빼낸 다음 데이터 필드의 값을 다음과 같이 사용합니다. 해당 데이터 레코드를 읽을 주소입니다.
MyISAM의 인덱싱 방식을 "비클러스터형"이라고도 부르는 이유는 InnoDB의 클러스터형 인덱스와 구별하기 위함입니다.
InnoDB 인덱스 구현
InnoDB도 인덱스 구조로 B+Tree를 사용하지만, 구체적인 구현 방법은 MyISAM과 전혀 다릅니다.
첫 번째 큰 차이점은 InnoDB의 데이터 파일 자체가 인덱스 파일이라는 점입니다. 위에서 알 수 있듯이 MyISAM 인덱스 파일과 데이터 파일은 분리되어 있으며 인덱스 파일에는 데이터 레코드의 주소만 저장됩니다. InnoDB에서 테이블 데이터 파일 자체는 B+Tree로 구성된 인덱스 구조이며, 이 트리의 리프 노드 데이터 필드는 완전한 데이터 레코드를 저장합니다. 이 인덱스의 키는 데이터 테이블의 기본 키이므로 InnoDB 테이블 데이터 파일 자체가 기본 인덱스가 됩니다.
그림 10은 InnoDB 메인 인덱스(데이터 파일이기도 함)의 개략도입니다. 리프 노드에는 완전한 데이터 레코드가 포함되어 있음을 알 수 있습니다. 이런 종류의 인덱스를 클러스터형 인덱스라고 합니다. InnoDB의 데이터 파일 자체는 기본 키로 집계되기 때문에 InnoDB에서는 테이블에 기본 키가 있어야 합니다(MyISAM에는 기본 키가 없을 수 있음). 기본 키가 명시적으로 지정되지 않은 경우 MySQL 시스템은 데이터를 고유하게 식별할 수 있는 열을 자동으로 선택합니다. 존재하지 않는 경우 이 유형의 열에 대해 MySQL은 자동으로 InnoDB 테이블의 기본 키로 암시적 필드를 생성합니다. 이 필드의 길이는 6바이트이고 유형은 길다.
MyISAM 인덱스와의 두 번째 차이점은 InnoDB의 보조 인덱스 데이터 필드에는 주소 대신 해당 레코드의 기본 키 값이 저장된다는 점입니다. 즉, InnoDB의 모든 보조 인덱스는 기본 키를 데이터 필드로 참조합니다. 예를 들어 그림 11은 Col3에 정의된 보조 인덱스를 보여줍니다.
여기서는 영어 문자의 ASCII 코드를 비교 기준으로 사용합니다. 클러스터형 인덱스를 구현하면 기본 키로 검색하는 것이 매우 효율적이지만 보조 인덱스 검색에서는 인덱스를 두 번 검색해야 합니다. 먼저 보조 인덱스를 검색하여 기본 키를 얻은 다음 기본 키를 사용하여 기본 키에 있는 레코드를 검색합니다. 색인.
다양한 스토리지 엔진의 인덱스 구현을 이해하는 것은 인덱스의 올바른 사용과 최적화에 매우 도움이 됩니다. 예를 들어 InnoDB의 인덱스 구현을 알고 나면 너무 긴 필드를 사용하지 않는 것이 왜 좋은지 쉽게 이해할 수 있습니다. 기본 키는 모든 보조 인덱스가 모두 기본 인덱스를 참조하기 때문입니다. 기본 인덱스가 길면 보조 인덱스가 너무 커집니다. 또 다른 예를 들어, InnoDB 데이터 파일 자체가 B+트리이기 때문에 비단조 필드를 기본 키로 사용하는 것은 InnoDB에서 좋은 생각이 아닙니다. 비단조 기본 키로 인해 데이터 파일이 B+트리의 특성을 유지하게 됩니다. 새 레코드를 삽입할 때 빈번한 분할 조정은 매우 비효율적이며 자동 증가 필드를 기본 키로 사용하는 것이 좋습니다.
위 내용은 Mysql 인덱스 구현원리 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!