MySQL 인덱스 1 - 기본 개념 및 인덱스 구조(B 트리, R 트리, 해시 등)

목차

인덱스(INDEX) 기본 개념

인덱스 구조 분류

B+Tree 트리 인덱스 구조

해시 인덱스 구조

전체 텍스트 인덱스

R-트리 인덱스


인덱스(INDEX) 기본 개념

색인이 무엇입니까

인덱스는 MySQL이 데이터를 효율적으로 검색하는 데 도움이 되는 정렬된 데이터 구조입니다.

데이터베이스 테이블의 일부 열에 대한 인덱스를 생성하는 것은 서로 다른 데이터 구조를 통해 데이터베이스 테이블의 일부 열 값을 정렬하는 것입니다.

열을 인덱싱한 후 데이터를 유지하는 것 외에도 데이터베이스는 특정 검색 알고리즘을 만족하는 데이터 구조도 유지합니다. 이러한 데이터 구조는 특정 방식으로 데이터를 가리키므로 이러한 데이터 구조에서 빠른 쿼리를 구현할 수 있습니다. 구조는 색인입니다

인덱스의 역할

인덱스는 정렬되지 않은 데이터를 정렬된 데이터로 변경하여 데이터베이스 테이블의 특정 정보에 빠르게 액세스할 수 있습니다.

장점과 단점

이점

데이터 검색 효율성 향상 및 데이터베이스의 IO 비용 절감

인덱스를 통해 데이터를 정렬하고, 데이터 정렬 비용을 줄이고, CPU 사용량을 줄입니다.

결점

인덱스는 공간을 차지합니다.

인덱스는 테이블의 쿼리 효율성을 향상시키지만 테이블 업데이트(삽입, 업데이트, 삭제) 속도를 감소시킵니다.

인덱싱은 효율성을 높이는 요소일 뿐인데, MySQL에 데이터가 많은 테이블이 있다면 최적의 인덱스를 찾는 데 시간을 투자해야 합니다. 는 하나의 인덱스만을 참조하며 일반적으로 테이블에 대해 설정된 인덱스의 수는 5개를 초과하지 않는 것이 좋습니다)


인덱스 구조 분류

인덱스 구조는 크게 4가지 카테고리로 나뉩니다.

B+트리 인덱스 - (B+ 트리)

가장 일반적인 인덱스 유형으로 대부분의 스토리지 엔진이 이 인덱스를 지원합니다.

해시 인덱스 - (해시 테이블)

기본 데이터 구조는 해시 테이블로 구현되며 인덱스 열과 정확히 일치하는 쿼리만 유효하며 범위 쿼리는 지원되지 않습니다.

전체 텍스트 색인 - (반전 색인)

전체 텍스트 인덱스라고도 하며 역 인덱스를 설정하여 문서를 빠르게 일치시키는 방법입니다.

R-Tree 인덱스(R-Tree tree)

공간 인덱스라고도 하며 MyISAM 엔진의 특수 인덱스 유형으로 지리적 위치 데이터에 주로 사용되며 거의 사용되지 않음

다양한 인덱스에 대한 스토리지 엔진 지원(기본 B+Tree 인덱스)

 MySQL 데이터베이스에서 Hash 인덱스를 지원하는 것은 Memory 엔진이고, InnoDB는 특정 조건에서 B+tree 인덱스에 따라 자동으로 생성되는 Adaptive Hash 기능을 가지고 있다.

B+Tree 트리 인덱스 구조

B+Tree 트리는 이진 트리 → 레드-블랙 트리(자체 균형 이진 트리) → B-트리 트리 불꽃놀이에서 파생됩니다. B+트리 트리를 소개하기 전에 이 세 가지 데이터 구조를 소개합니다.

이진 트리

이진 트리의 각 노드는 최대 두 개의 하위 노드(2개의 하위 트리)를 가지며 두 개의 하위 노드는 순서가 지정됩니다.

단일 노드를 예로 들어 보겠습니다. 왼쪽 자식 노드는 자신보다 작고 오른쪽 자식 노드는 자신보다 큽니다.

결점

  1. 데이터 양이 많은 경우 계층 구조가 깊고 검색 속도가 느림
  2. 기울어진 나무(왼쪽 또는 오른쪽으로 기울어짐) 형성 용이

 이진 트리 작동 방식

 이진 트리의 데이터 삽입(30, 40, 20, 19, 21, 39, 35 순서대로 삽입)

 이진 트리 데이터 순회

 이진 트리의 데이터 조회(39, 21, 25 찾기)

 이진 트리의 데이터 삭제(19, 39, 30 순서대로 삭제)

레드-블랙 트리(자체 균형 이진 트리)

레드-블랙 트리는 이진 트리의 변형으로 이진 트리에 값을 삽입할 때 트리가 기울어지는 문제를 해결할 수 있습니다.

모든 노드에는 색상(빨간색 또는 검은색)이 있으며 이 색상은 트리의 삽입 및 삭제 시 균형을 유지하는 데 사용됩니다.

루트 노드는 검은색이어야 합니다. Null 노드는 검은색으로 간주되며 각 빨간색 노드의 두 리프 노드는 검은색입니다.

연속적인 레드 노드는 각 리프 노드에서 루트까지의 경로에 나타날 수 없습니다.

리프 노드에 도달하기 위해 임의의 노드가 통과하는 블랙 노드의 수는 동일해야 합니다.

레드-블랙 트리에서 삽입 및 삭제 작업을 할 때 트리 구조는 트리의 균형을 유지하기 위해 왼손잡이, 오른손잡이, 다시 칠해집니다.

결점

  1. 삽입 및 삭제 작업이 많은 경우 트리 재구성이 자주 발생하여 성능에 영향을 미칠 수 있습니다.
  2. 레드-블랙 트리의 구현은 더 복잡하고 노드의 색상과 균형을 유지해야 합니다.
  3. 레드-블랙 트리도 본질적으로 이진 트리인데, 데이터가 많을수록 계층 구조가 깊어지고 검색 속도가 느려집니다.

레드-블랙 트리의 작동 방식

레드-블랙 트리의 데이터 삽입(순서대로 30, 40, 20, 19, 21, 39, 35 삽입)은 오른쪽 회전을 사용합니다.

레드-블랙 트리의 데이터 순회

레드-블랙 트리의 데이터 조회(39, 21, 25 찾기)

red-black tree의 데이터 삭제(19, 39, 30번 순서대로 삭제)

B-Tree 트리(다방향 균형 검색 트리)

이진 트리의 노드 노드는 키와 값만 저장할 수 있고 자식 노드가 두 개뿐이므로 다중 트리에 비해 노드 노드는 더 많은 키와 값을 저장할 수 있고 더 많은 자식 노드를 포함할 수 있습니다. 트리의 높이가 증가합니다. 이진 트리보다 낮습니다.

B-Tree 트리의 노드에 얼마나 많은 Key와 Value를 저장할 수 있는지, 최대 차수로 결정 가능한 자식 노드의 수(MAX-Degree를 순서라고도 함)

차수 m의 B-트리

       트리의 각 노드에는 최대 m개의 자식 노드, m-1개의 키 및 값이 있습니다(두 하위 트리의 포인터는 키와 값 사이에 있음).

       트리의 루트 노드에는 적어도 하나의 키와 값, 그리고 적어도 두 개의 자식 노드가 있습니다.

결점

B-트리의 리프 노드와 비리프 노드 모두 데이터를 저장하므로 비리프 노드가 저장하는 포인터의 양이 더 적습니다.

많은 양의 데이터를 저장하는 경우 트리의 높이를 높여야 하므로 IO 작업이 많아지고 쿼리 성능이 저하됩니다.

B-Tree 트리 작동 방식

B-Tree 트리 데이터 삽입 Max-Degree는 3(순서대로 30, 40, 20, 19, 21, 39, 35 삽입)

B-Tree 트리 의 데이터 순회

B-Tree 트리 의 데이터 조회 (39, 21, 25 찾기)

B-Tree 트리의 데이터 삭제(19, 39, 30번 순서대로 삭제)

B+ 나무

B+Tree 트리는 B-Tree 트리의 변형으로 다자간 탐색 트리이기도 하며 정의는 기본적으로 B-Tree와 동일하다.

B+Tree는 리프 노드에만 데이터를 저장하고 모든 요소는 리프 노드에 나타납니다. 모든 리프 노드는 단방향 연결 목록을 형성합니다. 리프 노드는 크기에 따라 데이터를 배열하고 크기에 따라 인접한 리프 노드를 배열합니다.

Non-leaf 노드는 데이터를 저장하지 않고 키만 저장하여 인덱스 역할만 하므로 동일한 양의 데이터에서 B+Tree 트리가 더 짧고 강함

B-Tree 트리 작동 방식

B+Tree 트리 데이터 삽입 Max-Degree는 3(순서대로 30, 40, 20, 19, 21, 39, 35 삽입)

B+Tree 트리 의 데이터 순회

B+Tree 트리의 데이터 조회(39, 21, 25 찾기)

B+Tree 트리의 데이터 삭제(19, 39, 30 순차 삭제)

MySQL 의 B+Tree 인덱스 구조

MySQL의 인덱스 데이터 구조는 고전적인 B+Tree를 최적화합니다.원래 B+Tree를 기반으로 인접한 잎 노드를 가리키는 연결 목록 포인터가 추가됩니다.모든 잎 노드는 양방향 연결 목록을 형성하여 개선됩니다. 횡단 속도.

MySQL은 쿼리 조건에 따라 해당 키 값(Key)을 쿼리한 후 키 값(Value)에 해당하는 데이터를 추출합니다.

해시 인덱스 구조

해시 인덱스는 특정 해시 알고리즘을 사용하여 키 값을 새로운 해시 값으로 변환하고 해시 값을 버킷에 매핑합니다.동일한 해시 값을 가진 모든 데이터 행의 포인터는 버킷에 저장된 다음 버킷에 저장됩니다. 해시 테이블 중간;

쿼리할 때 MySQL은 먼저 해시 함수를 통해 쿼리 조건의 해시 값을 계산하고 해시 테이블에서 해당 버킷을 조회한 다음 해당 버킷에서 해당 데이터 행을 조회합니다.

해시 충돌

두 개 이상의 키 값이 동일한 슬롯(버킷)에 매핑되면 해시 충돌이 발생하며 연결 ​​목록을 통해 해결됩니다.

 특징

  1. 해시 인덱스는 피어 투 피어 비교(=, in 등)에만 사용할 수 있으며 범위 쿼리(between, >, < 등)는 지원되지 않습니다.
  2. 해시 인덱스는 정렬 작업을 완료하는 데 사용할 수 없습니다. 해시 인덱스는 해시 계산 후 해시 값을 저장하기 때문에 이 값의 크기가 해시 연산 전의 키 값과 반드시 ​​정확히 일치하지는 않습니다.
  3. 해시 인덱스는 테이블 스캐닝을 피할 수 없습니다. 즉, 매번 전체 테이블을 스캔해야 합니다 . 는 동일한 Hash 값, 즉 해시 충돌이므로 특정 Hash 키 값을 만족하는 데이터의 레코드 홉은 Hash 인덱스에서 직접 쿼리할 수 없으며 여전히 액세스 테이블에서 실제 데이터를 비교하고 가져오는 작업이 필요합니다. 해당 결과
  4. 공동 인덱스의 경우 Hash는 인덱스 키 쿼리의 일부를 사용할 수 없습니다(모두 사용되거나 모두 사용되지 않음).
  5. 해시는 데이터가 있는 버킷을 찾기 위해 한 번의 연산만 하면 되고, 트리 구조와 같이 루트 노드와 리프 노드의 순서로 검색하는 것이 아니므로 이론적으로 해시 인덱스의 쿼리 효율이 B보다 높다. +Tree, 그러나 같은 Hash 값이 많은 경우 성능이 B+Tree보다 반드시 높지 않음

전체 텍스트 인덱스

역색인(Inverted Index)을 구축하여 Full-Text 색인을 구축하여 데이터 검색 효율 향상

역색인은 문서의 단어/한자를 발생 위치에 매핑한 데이터 구조로 주로 필드의 값에 특정 문자/한자가 포함되어 있는지 판단하는 문제를 해결하는 데 사용됩니다.

단순한 비즈니스나 데이터가 적은 비즈니스의 경우 Like() 키워드를 사용하여 판단할 수 있지만 데이터가 많은 비즈니스의 경우 Like를 사용하는 효율성이 크게 떨어집니다.

다른 스토리지 인덱스는 전체 텍스트 인덱스를 지원합니다.

MySQL 5.6 이전에는 MYISAM 스토리지 엔진만 전체 텍스트 인덱싱을 지원합니다.

MySQL 5.6 이후 InnoDB는 전체 텍스트 인덱싱을 지원할 수 있지만 중국어가 아닌 영어로만 전체 텍스트 인덱싱을 지원하고 이후에는 내장된 토크나이저(ngram)를 통해 중국어 인덱싱을 지원합니다.

ngram의 최소 길이 구성

MySQL 구성 파일에 다음 필드를 추가합니다.

ft_min_word_len = 2 #이 최소 길이는 단어 분할의 최소 길이이며 기본값은 2입니다.

즉, 한 문장에 대해 여러 개의 한자 그룹으로 나눌 수 있으며 각 한자 그룹에는 최소 2개의 한자가 포함됩니다.

    나는 데이터베이스를 배우고 싶다는 단어로 나눌 수 있습니다: 나는 데이터베이스의 세 그룹을 배우고 싶습니다

일반적으로 ngram은 매우 작게 설정되지 않으며 작으면 많은 공간을 차지하므로 일반적으로 이 최소 길이를 수정하지 않으며 기본값은 2입니다.

전체 텍스트 인덱싱 프로세스

사용자가 검색할 내용 입력 → SQL 실행 엔진 → ngram이 검색된 내용에 대해 단어 분할 수행 → 단어 분할 후 단어를 역인덱스에 넣어 검색 → 해당 레코드 반환

토크나이저 ngram은 인덱싱할 때 필드의 값을 토큰화하고 쿼리할 때 찾을 콘텐츠도 토큰화합니다.

R-트리 인덱스

쿼드트리 및 R-트리 트리와 같은 공간 인덱스 구축을 위한 다양한 데이터 구조가 있습니다.

MySQL에서는 공간 데이터의 질의 속도를 높이는 기술인 R-Tree 트리를 통해 공간 인덱스를 구축한다.

R-tree는 공간 데이터를 일련의 사각형 영역으로 나누고 각 노드는 사각형 영역을 나타낼 수 있으며 다른 노드 또는 데이터 항목을 포함할 수 있습니다. 이 계층 구조를 통해 MySQL은 공간 쿼리에서 필요한 데이터를 더 빨리 찾고 검색 범위를 줄여 쿼리 성능을 향상시킵니다.

예를 들어:

테이블의 특정 필드에는 현지 식당의 위도와 경도 위치 정보가 저장되어 있으므로 이제 우리 위치를 기준으로 1km 이내의 식당을 찾아야 합니다.

위치를 계산하여 1km 이내의 위도 및 경도 범위를 찾은 다음 이 위도 및 경도를 만족하는 테이블의 값을 쿼리할 수 있습니다. 위도 및 경도 위치 정보를 저장합니다.

R-Tree - R-tree의 구축 과정은 B-tree의 아이디어를 다차원 공간으로 확장하는 것입니다.

1. 데이터 분할

모든 데이터 항목도 개체(점, 선 또는 영역)가 되어 단일 사각형으로 취급됩니다.

2. 리프 노드 구축(리프 노드는 R 트리의 맨 아래 노드임)

분할된 사각형을 그룹화하고 리프 노드를 구성합니다. 각 리프 노드에는 여러 개체와 해당 사각형이 포함됩니다.

3. 리프 노드 병합

리프 노드의 수가 R-Tree에서 지정한 최대 용량을 초과하면 R-Tree는 인접한 리프 노드를 병합하여 트리 높이를 줄이고 쿼리 효율성을 향상시키려고 시도합니다.

4. 리프가 아닌 노드 구축

병합된 리프를 새 비리프 노드로 구성합니다. 비리프 노드도 모든 하위 노드의 직사각형 범위를 포함하는 직사각형입니다.

5. 재귀적 구성

전체 R 트리의 루트 노드가 구성될 때까지 위 작업을 반복합니다(R 트리의 최상위 노드에는 모든 데이터 범위가 포함됨).

특정 R 트리 구성 방법은 다음 기사를 참조할 수 있습니다.

B 트리, B+ 트리, B* 트리에서 R tree_v_JULY_v의 블로그로 - CSDN 블로그 https://blog.csdn.net/v_JULY_v/article/details/6530142

Supongo que te gusta

Origin blog.csdn.net/m0_49864110/article/details/132092917
Recomendado
Clasificación