자바 아키텍처의 InnoDB의 인덱스 원칙 -MySQL 자세한

색인에 나무의 다양한 지식이 소개 MySQL의 InnoDB의 인덱스에서 세부 사항을 저장하기 위해 노력하고 있습니다.

(Mysql5.5.5가의 MyISAM, 문서 전에) MySQL의 InnoDB는 기본 스토리지 엔진이다. 이노을 소개하는이 부분의 효율적인 학습의 목적에서 소량의 MyISAM 비교 관한 것이다.

이 문서에서는 주로 책과 블로그 (참고가 주어집니다), 자신의 이해의 일부를 추가하는 과정은, 부정확 한 지적 설명해주십시오에서, 완성 된 학습 과정에서 내 요약 한 것입니다.

나무의 다양한

나는 이미 너무 많은 관련 기사 온라인 있기 때문에, 이진 검색 나무에서 시작하려는, 그러나 큰 도움의 명확한 그림이 문제를 이해하고, 문서의 무결성을 보장하기 위해, 마지막으로이 부분을 추가 부여하지 않았다.

몇 트리 구조를 살펴 보자 :

1 이진 트리 검색 : 각 노드는 두 아이를 가지고, 데이터의 양이 증가가 불가피 높이의 급격한 증가로 이어질 것, 인프라가 데이터 저장의 많은 양으로 적합하지 않은 것은 분명하다.

2 트리 B :는 m 차 B-트리는 균형 탐색 트리 경로 m이다. 가장 중요한 특성은 각 루트가 아닌 노드 J에 포함 된 키워드의 수를 만족 : ┌m / 2┐ - 1 <= J를 <= m - 1, 노드 1의 자식 수는 키워드의 수보다 더 많은 것 그래서 핵심 부문 플래그 자식 노드되고있다. 하여 B + 트리의 뒷면을 구별하기 쉽고 또한 중간 비디오의 키워드, 아주 이미지 및에 자식 노드에 일반적으로 설명합니다. 데이터가 잎 이외의 노드와 리프 노드에 존재하기 때문에, 단순히 B-트리 탐색 키를 완료하기 위해, 방법은 통과하기 위해 사용되어야하지.

3의 B + 트리 일 : m 차 B-트리는 균형 탐색 트리 경로 m이다. 가장 중요한 성질은 각각 비 루트 노드 J 만족 키워드의 수가 포함되어 ┌m / 2┐ - 1 <= J를 <= m; 많은 서브 트리 같은 키워드의 최대 수. 비 리프 노드는 키워드의 작은 하위 트리에 저장됩니다. 데이터 노드 만 측면 포인터 증가 사이의 잎 노드 및 리프 노드에 존재하는 동안 매우 쉽게 모든 데이터를 가로 지르는의 순서 있도록.

도 4의 B * 트리 일 : m 차 B-트리는 균형 탐색 트리 경로 m이다. 각 비 루트 노드 1의 가장 중요한 특성은 키워드의 수가 J 만족을 포함 : ┌m2 / 3┐ - 1 <= J <= m 2 개의 횡 포인터 사이의 비 - 리프 노드했다.

B / B + / B의 * 나무 등을 찾는 중 / 삽입 / 삭제 노드와 유사한 작업의 3 종류가 있습니다. 여기에만 삽입 노드의 경우에 초점에만이 작업은 좀 더 복잡하고 완벽하게 몇 가지 나무의 차이를 반영 할 수 있기 때문에 현재 상황에서의 삽입, 노드의 가득 분석 할 수 있습니다. 대비 (종종 이후의 사용을 위해 데이터 보존 공간을 삭제 작업이 실제 응용 프로그램에서 완전히 역 삽입되지 않습니다 삭제) 노드에 삽입 절차에 정반대만큼 삭제, 검색 노드를 구현하기가 상대적으로 용이하다.

B- 트리 분할 봐, 다음 그림은 빨강의 값은 새로운 노드가 삽입 될 때마다입니다. 노드가 가득 할 때마다 분할이 발생하기 위해서는, 분할 노드가 전체되도록 인해 또한 저장된 B 트리 키의 비 - 리프 노드 (절단은 다음과 같은 참조 7 개의 구획에 삽입 리드 재귀 과정)가 필요 값은 세 곳에서 분산된다 : 본래 노드 원래 2 노드의 부모 노드 원래의 새로운 노드 3 형제 노드 (삽입 5,7 참조). 분할 트리 (5,6- 삽입 참조)의 높이에 영향을 미치지 않을 수 트리 (3,7- 삽입 참조)의 높이를 증가시킬 수있다.

B + 트리 분할 : 전체 노드가 새로운 노드와 노드에 원래의 1/2 데이터를 복사하고, 마지막으로 부모 노드에서 새 노드로 포인터를 증가시키기 위해, 새로운 노드를 할당; B + 분할 나무는 형제에 영향을주지 않고, 단지 원래의 노드와 부모 노드에 영향을 미치는, 그래서 형제 노드에 대한 포인터를 필요로하지 않습니다.

B 분할 트리 : 그것은 다음 형제 노드, 형제 노드로 데이터의 일부 완전하지 않습니다, 그리고 다음 원래 노드에 키워드를 삽입하고 마지막으로 형제의 부모 노드를 수정하는 경우 노드가 가득 차면 키 포인트 (키워드 범위 형제가 변경 되었기 때문에). 형제가 가득 찬 경우, 원본과 새로운 추가 형제 노드 간의 접합, 각각 새로운 노드는 부모 노드의 새로운 노드의 마지막 상승 포인터 데이터의 1/3를 복사한다. B는 볼 수 B-에 있기 때문에, 나무는 매우 영리한 분할 B + 트리 접근 방식은 단순히 전체 두 가지로 노드, 각 이끌 것인지 트리 노드가, 심지어 분할 후 3 분의 2 풀 수 있도록 절반 만 전체 노드는이 B는 맞지 않는 나무의 요구 사항을. 따라서 B의 정책은 트리 노드가 가득 후, (B 이유입니다 형제를 삽입 계속 촬영 노드도 일당으로 채워질 때까지 나무는 잎 이외의 노드에서 형제 사이에 체인을 추가해야합니다) 다음 함께 어떤 식 으로든 형제를 긁어 요소, 자신의 형제 자매는 각각의 새로운 노드의 설립의 3 분의 1을 기여하고, 이러한 결과는 세 개의 노드 B의 * 트리, 행복의 요구 사항에, 3 분의 2 전체 될 일이다.

데이터베이스에 대한 근거로 B + 트리 구조, 단순히 컴퓨터의 메모리 때문에 -이 개 기계의 하드 디스크 저장 구조. 메모리 (특정 주소로 즉, 랜덤 액세스에 필요한 데이터 주소를 저장 반환) 빠른 랜덤 액세스를 수행하지만, 작은 용량을 할 수 있습니다. 기계적 작용을 통해 하드 디스크, 랜덤 액세스 (디스크 (2)를 이동시키는 헤드 회전)보다 낮은 크기이지만 대용량 하드 디스크 메모리 액세스 효율 주문. 전형적인베이스 용량은 크게 B에서 검색된 데이터를 결정 + 트리 완료 디스크 IO 동작에 의해 수회 될 가능성이 사용 가능한 메모리의 크기를 초과한다. 아래와 같이 : 일반적 행동의 다음 노드가 디스크 IO 작업을 읽어야 할 수도 있지만, 잎 이외의 노드는 일반적으로 액세스 속도를 초기 단계에서 메모리에로드됩니다. 노드 사이의 수평 이송 속도를 향상시킬 수있는 동시에, 데이터베이스 사실 파란색 가능한 CPU / 메모리 이진 검색 트리도 (InnoDB의 메커니즘 페이지 디렉토리)에 최적화 된 읽을 수 있습니다.

데이터베이스의 실제 B + 트리를 어떻게 결국 B + 트리 플랫 InnoDB의 데이터 충분한 방식의 테이블에 인증하기 위해 삽입 할 수있는, 매우 평평해야합니다. 우리는 다음과 같이 만 CREATE 문을 통해 간단한 필드 테스트 테이블을 구축 한 다음이 테이블을 채울 데이터를 계속 추가. 아래의 통계에 의해 여러 직관적 인 결론을 분석 할 수 있습니다 (참고 1 소스 참조), 이러한 결론은 B + 트리 데이터베이스 거시적을 보여줍니다.

각 1 리프 노드 (468 개)의 데이터 열을 저장하는 1200 개의 값에 대한 각각의 비 - 리프 노드 점포.이 균형 탐색 트리 1,200도있다!

22.1G 용량 표 2는 B 3 + 트리의 필요한 높이를 저장할 수 있으며, 용량은 응용 프로그램의 요구의 대부분을 충족 할 수있을 것입니다. 높이가 4로 증가되는 경우, B의 + 트리의 저장 용량은 즉시 큰 25.9T로 증가!

22.1G의 용량 표 3, B + 트리의 높이가 우리가 아닌 모든 잎 노드가 메모리에로드하려는 경우에만 18.8M 메모리 채 걸리지 세이다 (어떻게?이 결론에 도달하기 때문에 2의 높이 트리 리프 노드는 데이터 행을 저장하기 때문에, 1203 잎 노드는 18.8M 공간 및 22.1G 3, 좋은 테이블의 높이에서 1204 잎 이외의 노드는. 우리는 리프 노드의 크기가 잎 이외의 노드보다 큰 것으로 가정 필요 단지 너무 작은 메모리를 보장 할 수있는 잎 이외의 노드에만 키와 적은 양의 데이터가.) 만 효율성이 매우 높은 데이터를 검색하는 데 필요한 하나 개의 디스크 IO 작업이 필요합니다.

2 MySQL의 스토리지 엔진 인덱스

그것은 데이터베이스 순차 검색에 대한 인덱스, 그 다음 어떤 색인 검색 과정이 있어야합니다 말할 수있다, O (n)의 시간 복잡도는 거의 참을 수 있습니다. 우리는 한 키가 될 수있는 트리의 노드에 저장 될 때, B + 트리 인덱스를 사용하는 방법에 대한 단 하나의 열쇠로 구성된 테이블을 상상하기가 매우 쉽습니다. 데이터베이스 레코드가 전답, B + 트리를 저장하는 다수 포함 된 경우 마스터 키는, 검색된 기본 키가 아닌 필드 경우, 기본 키 인덱스 조치를 벗어 순차 검색으로 전환 할 수 있습니다. 이때 두 번째 열의 인덱스를 검색하는 제 2 세트에 기초한다. 이 지수는 독립적 인 B + 트리로 구성되어있다. 더 많은 문제의 B + 트리 액세스 클러스터 된 인덱스 (클러스터 인덱스)라는 데이터 테이블의 동일한 집합이라고 클러스터되지 않은 인덱스 (보조 인덱스)를 해결하는 일반적인 두 가지 방법이 있습니다. 이 두 이름은 인덱스라고하지만, 이것은 별도의 인덱스 유형하지만, 데이터 저장은 아니지만. 스토리지 클러스터 인덱스 만 보조 키 보조 스토리지 및 기본 키, 마스터 키와 키가 아닌 B + 트리 함께 키 B + 트리, B + 트리를 저장 메인 라인 데이터의 경우 나무의 거의 두 가지 유형입니다. 클러스터되지 않은 인덱스가 저장되어있는 경우, B + 트리 리프 노드의 기본 키 대신 기본 키의 실제 데이터 라인에 대한 포인터를 저장합니다.

클러스터 된 인덱스를 사용 이노가 기본 키가 B + 트리로 구성되고, 광고 데이터는 상기 조건의 기본 키를 찾기 위해 "ID = 14 여기서"검색 알고리즘 B + 트리에 따라서, 즉 사용하여, 리프 노드에 저장된 당신은 데이터의 행을 얻은 후, 해당 리프 노드를 찾을 수 있습니다. 획득 한 기본 키에 해당 리프 노드에 도달 보조 검색 이름에 B의 + 트리 인덱스의 첫 번째 단계 : 조건 검색의 이름 열은 두 단계가 필요합니다. 두 번째 단계는 데이터의 최종 리프 노드 행 전체를 얻는 다른 B + 트리 검색 작업을 수행 차의 B + 트리 인덱스의 기본 키를 사용한다.

클러스터되지 않은 인덱스 MyISM 사용 두 B의 + 트리, 클러스터되지 않은 인덱스의 저장된 내용이 다른 것을 제외하고 노드의 구조는 다른 어떠한가 정확히 노드 기본 키 인덱스 B + 트리 저장된 주요 키 및 보조 키 인덱스 B + 트리 저장 동일 보지 않는다 보조 키를 누릅니다. 테이블 데이터는이 두 B + 트리 잎 노드가 테이블 데이터에 대한 실제 주소 포인트 테이블 데이터를 사용하고 별도의 장소에 보관되어, 차이는이 두 개의 키가 없다. 인덱스 트리 독립적이기 때문에, 보조 키를 통해 기본 키 인덱스 트리에 액세스하지 않고 검색.

상기 두 영상 인덱스 간의 차이를 설명하기 위해 아래의 가상 테이블은 데이터 선 (4)이 저장된다. 상기 식에서 아이디 보조 인덱스로 주요 지수 이름으로. 명확하게 설명 된 차이와 클러스터되지 않은 인덱스 클러스터 된 인덱스를 보여줍니다.

이 개 B + 트리 후마다 보조 인덱스 검색을 찾을 수 있기 때문에 우리는 클러스터 된 인덱스에 초점 클러스터 된 인덱스, 클러스터되지 않은 인덱스의 효율보다 훨씬 낮은 것으로 보인다, 이것은 당신을 귀찮게하지 않습니다? 장점은 인덱스 어디 클러스터?

데이터 라인 (1)와 리프 노드가 함께 저장되므로 기본 키 및 데이터 라인은 메모리에로드되어 있기 때문에, 리프 노드가 즉시 데이터 행을 반환 데이터를 구성 빠르게 데이터를 얻기 위해 기본 키 ID에 따라 할 수 있습니다 찾을 수 있습니다.

는 "포인터"로 기본 키 인덱스를 사용하는 대신 보조 라인 또는 모바일 데이터 페이지 분할 인덱스가있을 때 유지 보수 작업을 감소 포인터로 주소 값을 사용하여 2 개 보조 혜택, 포인터 등의 기본 키 값은 보조 인덱스의 사용이 더 걸릴 만들려면 이 보조 인덱스를 업데이트하지 않고 행 모바일 이노의 혜택에 대한 대가로 많은 공간 "포인터." 즉에서 클러스터 된 인덱스를 이용하여, 데이터베이스 내의 데이터의 변형 (B + 트리 페이지 노드의 분할 및 분할 앞)으로 변경한다 (아래 구현 페이지 16K 의해 위치 관련) 행의 위치이고 에 상관없이 B + 트리의 변경이 기본 키 노드가 보조 인덱스 나무가 영향을받지 않는 방법을 확인 없습니다.

3 페이지 구조

전술은 나중에 특정 구현을 처리하기 시작했다 해석의 원칙에 찬성 바이어스됩니다.

페이지를 언급해야 구조의 이해를 달성 이노, 페이지 전체 InnoDB 스토리지의 가장 기본적인 부분, InnoDB는이 페이지에서 데이터베이스 구조에 저장되어있는 디스크 관리의 가장 작은 단위 및 모든 관련 콘텐츠입니다. 여러 종류로 분류 페이지, 페이지 공통 데이터 페이지 (B-트리 노드)의 유형은 페이지 (취소 로그인 페이지) 페이지 시스템 (시스템 페이지) 페이지 데이터 트랜잭션 (거래 시스템 페이지) 등을 취소합니다. 페이지 크기 의적 64TB 이노의 최대 저장 용량을 정확하게 일치하는 식별하는 32 비트 페이지 당 INT 값을 이용하여, 상기 단일 16K (컴파일러 매크로 UNIV_PAGE_SIZE 제어)이다 (16Kib * 2 ^ 32 = 64Tib). 페이지의 기본 구조는 다음과 같이 :

GM 각 페이지의 머리와 꼬리를 갖지만, 중앙 페이지의 콘텐츠 유형에 따라 변한다. 페이지의 머리는, 우리가 염려하는 일부 데이터, 디스플레이 페이지 헤더 정보 아래 그림이 있습니다 :

우리는 조직 구조와 관련된 필드와 데이터에 초점 : 페이지 헤더는 전 페이지, 페이지의 머리뿐만 아니라 고유의 페이지 번호를 식별하는 정보의 유형에 시점 이후 두 개의 포인터, 페이지를 저장. 이 두 가지 지표에 따르면 우리가 쉽게 페이지는 이중 연결리스트 구조로까지 연결 상상할 수있다.

페이지 본문 내용 봐, 우리가 행과 인덱스 데이터 저장에 초점을, 그들은 사용자 레코드 페이지 섹션에, 사용자 기록 페이지는 대부분의 공간, 녹음 한 구성 요소에서 사용자의 기록은, 각 레코드는 인덱스를 나타냅니다 점유하며 나무 (잎 이외의 노드와 리프 노드)의 노드. 페이지의 내부에서, 하나의리스트 기록 헤드 및 꼬리는 문자열 "Supremum"대표 끝의 「상하 한 "대표부터 고정 개의 콘텐츠에 의해 표현된다. 기록 시스템 기록의 종말의 시작을 표현하기 위해 사용되는 두 개의 평행 한 세그먼트는 세그먼트의이 및 사용자 기록 시스템 기록에 저장됩니다. 기본 키 인덱스 트리의 리프 노드이 개 아닌 기본 키 인덱스 노드 3은 2 차 키 인덱스 트리 네 잎 이외의 노드를 잎 보조 키 인덱스 노드를 잎있는 4 가지 InnoDB의 기록이있다. 네 개의 노드의 기록 형식은 약간의 차이가 있지만, 그들은 다음 레코드에 대한 포인터로 저장됩니다. 우리는 이제 단일 연결리스트 노드는 포인터에 다음 데이터를 포함하는 등의 기록을 저장할 필요, 의지 세부에게 네 개의 노드를 따릅니다.

페이지의 단일 목록의 형태로 사용자 레코드는, 초기 데이터는 삽입에 따라 연대순으로 배열하지만, ​​새로운 데이터의 삽입과 오래된 데이터를 혼동 할 데이터의 물리적 순서를 삭제할 수 있지만 그들은 여전히 ​​논리를 유지 순서에.

사용자 기록은 조직과 결합 된 페이지의 숫자의 형태는 약간의 전체 형태를 보았다.

이제 기록을 배치하는 방법을 살펴 :

하나는 결국 페이지에 도달 리프가 아닌 노드의 레이어를 통해하는 B의 + 트리 인덱스의 루트를 통과하여, 페이지는 리프 노드에 저장된다.

(최적화를 횡단하는 경향)는 단일 연결리스트를 탐색 "상하 한"노드에서 페이지 2는 경우 키는 성공적인 복귀를 찾는 것입니다. 레코드가 "supremum"를 도달 할 경우, 적절한 키, 다음 페이지 포인터의 페이지를하는 데 도움이 시간, 페이지 하나가 "상하 한"을 찾기 시작하여 다음 단계로 이동하려면 계속되지 현재 페이지를 설명합니다.

어떻게 서로 다른 유형의 데이터에 기록 자세히보기는 B + 트리 노드에 따라 마지막에 저장되어, 사용자 레코드는 네 가지 형식으로 나눌 수 있습니다도의 종류 색상으로 구분 될 수있다.

1 개 트리 기본 색인 잎 이외의 노드 (녹색)

아이 노드 1 개 저장합니다 B + 트리해야 가장 작은 값 (아이에 최소 클러스터 키)의 기본 키는 역할 레코드의 위치를 ​​특정의 페이지입니다.

페이지 번호 (하위 페이지 번호) (2) 여기서, 최소값, 기록 위치의 역할.

2 주 인덱스 노드 (노란색) 잎

기본 키 (클러스터 키 필드), B + 트리해야하고, 데이터 라인 1 부

2 제거 모든 열의 기본 키 데이터 열을 제거하는 다른 모든 열들의 집합 메인 키 이외 (비 키 필드).

1 두 부분은 데이터의 전체 라인을 추가 2.

비 트리의 3 차 인덱스 잎 이외의 노드 (파란색)

A B + 트리 있어야 최소값 (최소 어린이에 이차 키)에 기억 된 자 노드에 보조 키의 역할은 기록 위치를 특정의 페이지이다.

2 차 키 (클러스터 키 필드), 왜 잎 이외의 노드는 그것의 기본 키를 저장해야? 보조 인덱스가 고유하지 않습니다,하지만 B + 트리의 핵심 요구 사항의 값은 고유해야하기 때문에, 그래서 여기에 보조 키의 값과 병합 B + 트리 실제 키와 기본 키 값은 고유성을 보장합니다. 그러나 그것은 또한 보조 인덱스 B + 트리의 리프 노드 아프리카에서 발생하지만, 4 개 이상의 바이트 잎 노드. (예.도 1의 노드에서 청색 적색보다 4 바이트이지만 이상)

페이지 번호 (하위 페이지 번호) (3) 여기서, 최소값, 기록 위치의 역할.

4 보조 인덱스는 노드를 잎 (적색)

상기 B + 트리에 필요한 보조 키 인덱스 (2 차 키 필드).

2 차 키 (클러스터 키 필드), 기본 인덱스 트리 전체 기록을 찾기 위해 B의 + 트리의 검색을 수행합니다.

다음 Benpian 이전에 B + 트리와 함께 설명 된 구조와 기록의 사가지 내용의 가장 중요한 부분, 마지막으로 우리는 파노라마를 그릴 수 있습니다. 기본 키 인덱스 보조 인덱스와 B + 트리 유사 구조를 갖기 때문에, 여기에만 단지 "기본 키 비 리프 노드"및 "차 키 리프 노드"즉,도 노드의 두 가지 유형을 포함하는, 기본 키 인덱스 트리의 블록도를 도시. 녹색과 노란색의 일부.

이 도면은 상기 B + 트리의 일부인 아래의 소형화 수형도로 감소된다. 해당 페이지가 B + 트리 노드 12시 59분 관계 페이지 기록만큼만 저장 용기 사이에하지 중이며 디스크 공간 트리에서 상기도 페이지 번호 (47)의 일괄 관리를 용이하게 존재 구조는 두 개의 노드로 분할되었다.

지금까지 Benpian는 말 Benpian 단지 InnoDB의 인덱스 데이터 구조와 구현의 MySQL의 실제 경험을 포함하지 않은, 일종의 요약을 수행 경우에도 마찬가지입니다. 이것은 주로 여러 가지 이유에 근거한다 :

하나는 완전히 우리가 효율적으로 사용할 수있는 기능을 얼마나 InnoDB의 인덱스를 이해하는 초석이 원칙이다.

지식의이 원리를 사용 아이콘에 특히 적합, 나는 개인적으로이 표현을 좋아한다.

InnoDB의 최적화에 (3)은 "고성능의 MySQL"에 자신의 지식을 얻을 수있는 MySQL의 최적화에 관심이 학생들에게보다 포괄적 인 소개가, 나는 아직 이들의 몫을 축적 된 지점에 도달하지 않았습니다.

HTTPS : //juejin.im/post/5cf0c91df265da1bb27715f7 재현

추천

출처blog.csdn.net/weixin_33973600/article/details/91441851