두 MySQL의 튜닝 (BTREE, B + 트리 인덱스 데이터 구조)

BTREE 속성

   BTREE도 알려진 다중 채널 균형 됨 나무 , 포크 m BTREE의 특성을 다음과 같이

  • 트리의 각 노드는 m 어린이까지 포함되어 있습니다.
  • 루트 노드 및 리프 노드들에 더하여, 각 노드는 적어도 [CEIL (m / 2)] 자식을 갖는다.
  • 루트가 잎 노드가 아닌 경우는, 적어도 두 아이가있다.
  • 모든 잎 노드는 같은 수준이다.
  • N 및 N + 1 포인터에 의해 각각의 비 - 리프 노드 키 여기서 [CEIL (m / 2) -1] <= N <= m-1.

BTREE 삽입

   BTREE 포크 (5), 예를 들면 키의 개수 : 화학식의 유도 CEIL (m / 2) -1] <= N <= m-1. 따라서 2 <= N <= 4. n이> 4, 부모 노드는 중간 노드를 분할, 분할 양쪽 노드.

  1. CNGAHEKQMFWLTZDPRXYS 예를 삽입하려면 처음 네 글자는 말할 수 없다.
                         
  1. 삽입 H, N>도 4는 중간 요소는 새로운 노드로 문자 G을 분할.

              

  1. 삽입 E는, K는, Q는 분리 할 필요가 없습니다.

             

  1. M이 삽입되고, 상기 중간 요소 M 문자가 상위 노드에 분할 G.

            

  1. F, W, L 삽입, T는 분할 할 필요가 없습니다.

       

  1. Z 삽입, T는 중간 요소는 부모 노드로 분할.

           

  1. 삽입 D는 D 중간 요소는 부모 노드로 분할. 그리고 분할 할 필요가 P, R, X, Y를 삽입합니다.

             

  1. 마지막 S, NPQR 노드 N> (5)를 삽입, Q는 중간 노드를 분할하지만, N> 5 DGMT 분할의 부모 노드는 중간 노드를 M 분할. 원래 BTREE 세 번째 자식 노드가 HKL DG 노드를 포함 할 것이라는 점을 주목해야한다.

             

     이하는 BTREE 건물 완료, 어떻게? 그것은 매우 간단하지 않다. 길이없는 이야기 주어진 삽입보다 약간 더 복잡 삭제합니다.

 

B + 트리

   B + 트리 BTREE 변종, B + 트리 BTREE 구별이다 :

  • N-N 서브 트리 키까지의 B + 트리를 포함하고, BTREE는 N-1 번째의 키까지 포함한다.
  • B + 트리 잎 노드는 모든 주요 정보, 크기에 따라 키 배열을 유지합니다.
  • 모든 잎 이외의 노드는 인덱스 키의 일부로 간주 될 수 있으며, 노드는 최대 (또는 최소) 자식 노드의 키가 포함되어 있습니다.
        

 

     由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走到叶子。所以B+Tree的查询效率更加稳定。

带有顺序指针的B+Tree

     MySql索引数据结构对经典的B+Tree进行了优化。

           

     在原B+Tree的基础上,增加一个指向相邻叶子节点的指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。
     如上图访问18-49的元素,只需要顺着18的指针走向49即可。

MySql索引数据结构

   在mysql中,索引的实现方式与存储引擎相关,MySql支持多种索引类型,如B+Tree、Hash索引、全文索引等等。在此只关注MyISAM与InnoDB的B+Tree索引数据结构。

   MyISAM的B+Tree索引

     MyISAM的主键索引与辅助索引在结构上没有任何区别,只是主键索引要求key唯一。可以看出,MyISAM的索引叶节点保存的是表的行的物理地址值。
     MyISAM的索引是“非聚集”的,这么称呼只是为了与InnoDB的聚集索引相区分。

     

   InnoDB的B+Tree索引

     InnoDB的索引实现方式与MyISAM截然不同,InnoDB的B+Tree叶子节点保存有完整的记录信息。这也解释了上篇所说的InnoDB的索引与数据文件是同一个文件。

     

     上图是B+tree的主键索引,这种索引也叫做聚集索引。InnoDB索引必须按照主键聚集,所有InnoDB必须要包含有主键。如果没有显示指定,MySql会自动选择一个唯一标识列或生成一个隐含字段作为主键。

     

 

     上图是InnoDB的B+Tree辅助索引,B+Tree的叶子节点只保存主键的值而不是行的地址值。所以辅助索引的检索需要检索两遍索引。

     因此,对于InnoDB的B+Tree索引使用有两个注意点:

  • 建议使用主键自增。由于B+Tree的特性,非自增的主键在插入时会造成B+Tree频繁的分裂。
  • 不建议主键字段过长。由于所有的辅助索引都会检索主键索引,过长的主键索引会使辅助索引过大。
 

 

 

 


 

추천

출처www.cnblogs.com/mzhaox/p/11297911.html