MySQL 고급 (3 개) 인덱스 소개 및 사용

MySQL 고급 (2 개) 인덱스 소개 및 사용

4. 색인 소개

4.1 인덱스 란 무엇입니까?

  • 인덱스는 MySQL이 데이터를 효율적으로 가져 오는 데 도움이되는 데이터 구조 이고 인덱스는 데이터 구조입니다!
  • 인덱싱의 목적은 사전과 비교할 수있는 쿼리 효율성향상시키는 것입니다.
  • 인덱스는 데이터베이스 시스템 이 검색 알고리즘의 특성충족 하기 위해 유지 하는 데이터 구조 입니다 . 이러한 데이터 구조는 특정 방식으로 데이터를 참조 (가리 키)합니다.
  • 일반적으로 색인도 매우 커서 메모리에 모두 저장할 수 없으므로 색인 파일 형태로 디스크에 저장되는 경우가 많습니다.

요약 : 정렬 된 빠른 검색 데이터 구조는 index 이므로 인덱스는 WHEREORDER BY 키워드 뒤에있는 조건부 필터링에 영향을줍니다 .

우리가 일반적으로 언급하는 색인은 특별히 지정되지 않은 경우 ** B 트리 (다중 검색 트리) ** 조직 구조의 색인을 나타냅니다. 그중 클러스터형 인덱스, 준수 인덱스, 접두사 인덱스, 고유 인덱스는 모두 기본적으로 B + 트리 인덱스를 사용합니다.

4.2 2 포크 BTREE 인덱스 데이터 구조 사례 :

여기에 사진 설명 삽입

Col2 검색 속도높이기 위해 오른쪽과 같이 이진 검색 트리를 유지할 수 있습니다. 각 노드에는 인덱스 키 값과 해당 데이터 레코드의 물리적 주소에 대한 포인터가 포함되어있어 특정 복잡도 내에서 두 검색을 사용할 수 있습니다. 조건을 충족하는 레코드를 빠르게 검색 할 수 있도록 해당 데이터를 얻습니다.

참고 : 데이터를 추가하거나 삭제할 때 색인이 무효화되지 않도록 색인을 수정해야합니다. 따라서 자주 추가하거나 삭제하는 데이터에 대해서는 인덱싱을 권장하지 않습니다. 논리적 삭제 (플래그 비트 삭제)를 사용하여 삭제 문제를 해결할 수 있습니다.

4.3 인덱싱의 장단점 :

장점 :

  • 대학 도서관과 유사하여 서지 색인을 구축하고 데이터 검색의 효율성을 높이며 데이터베이스의 IO 비용을 줄입니다.
  • 열을 인덱싱 하여 데이터를 정렬 하면 데이터 정렬 비용이 절감되고 CPU 소비가 감소합니다.

단점 :

  • 사실, 인덱스는 기본 키와 인덱스 필드를 보유하는 테이블이기도하며 솔리드 테이블을 기록하는 것을 가리 킵니다. 인덱스는 공간차지하는 인덱스 열 입니다.
  • 인덱스는 쿼리 속도를 크게 향상 시키지만 테이블의 INSERT, UPDATE 및 DELETE와 같은 테이블 업데이트 속도감소시킵니다 . 테이블을 업데이트 할 때 MySQL은 데이터를 저장할뿐만 아니라 인덱스 파일도 저장해야하기 때문에 인덱스 컬럼의 필드가 업데이트 될 때마다 업데이트로 인한 키 값 변경 후 인덱스 정보를 조정합니다. 데이터 위치도 동시에 수정해야합니다.
  • 인덱스는 효율성을 향상시키는 요소 일뿐입니다. MySQL에 많은 양의 데이터가있는 테이블이있는 경우 최상의 인덱스를 조사하고 구축하고 쿼리를 최적화하는 데 시간이 걸립니다.

4.4 색인 분류 :

  1. 단일 값 인덱스 : 즉, 인덱스에는 단일 열만 포함되고 테이블에는 여러 단일 값 인덱스가있을 수 있습니다.
  2. 고유 색인 : 색인 열의 값은 고유해야하지만 null 값이 허용됩니다.
  3. 복합 색인 : 색인에 여러 열이 포함됨

기본 구문 :

  • 창조하다
CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));

ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length));
  • 지우다
DROP INDEX [indexName] ON mytable;
  • 전망
SHOW INDEX FROM table_name

4.5 MySQL 인덱스 구조 :

MySQL은 BTREE 인덱스, Hash 인덱스, 전체 텍스트 인덱스, R-Tree 인덱스의 4 가지 인덱스 구조를 지원합니다 .Java 개발은 주로 BTREE 인덱스를 사용합니다.

BTREE 지수 :

여기에 사진 설명 삽입

[초기화 소개]

위 그림에서 B + 트리, 하늘색 블록을 디스크 블록 이라고하며, 각 디스크 블록에는 여러 데이터 항목 (진한 파란색으로 표시)과 포인터 (노란색으로 표시 ) 가 포함되어 있음을 알 수 있습니다 . 예를 들어, 디스크 블록 1에는 포인터 P1, P2 및 P3을 포함하여 데이터 항목 17 및 35가 포함됩니다. P1은 17보다 작은 디스크 블록을, P2는 17에서 35 사이의 디스크 블록을, P3은 35보다 큰 디스크 블록을 나타냅니다.

실제 데이터는 리프 노드 , 즉 3,5,9,10 ...에 존재합니다 . 리프가 아닌 노드는 실제 데이터를 저장하지 않으며 value는 데이터 테이블에 실제로 존재하지 않는 17, 35와 같이 검색 방향안내하는 데이터 항목저장 합니다.

[검색 과정]

데이터 항목 29를 찾으려면 먼저 디스크 블록 1을 디스크에서 메모리로로드합니다.이 때 IO가 발생합니다. 이진 검색을 사용하여 디스크에서 29가 17에서 35 사이인지 확인하고 디스크 블록 1의 P2 포인터를 잠급니다. 메모리 시간은 디스크 IO에 비해 매우 짧으며 무시할 수 있습니다. 디스크 블록 3은 디스크 블록 1의 P2 포인터의 디스크 주소를 통해 디스크에서 메모리로로드되고 두 번째 IO가 발생하고 디스크 블록 3의 P2 포인터는 이진 검색으로 잠기고 디스크 블록 8은 포인터를 통해 메모리로로드되고 세 번째 발생 IO, 쿼리의 끝입니다.

실제 상황은 3 계층 B + 트리가 수백만 개의 데이터를 나타낼 수 있다는 것입니다. 수백만 개의 데이터 검색에 3 개의 IO 만 필요하면 성능이 크게 향상됩니다. 인덱스가 없으면 각 데이터 항목이 1 회 발생합니다. IO의 경우 총 수백만 개의 IO가 필요하며 이는 분명히 매우 비용이 많이 듭니다.

4.6 지수 설정 분석 :

4.6.1 인덱스 생성에 필요한 상황 :

  • 기본 키는 자동으로 고유 인덱스를 생성합니다.
  • 쿼리 조건 이 인덱스를 생성해야하는 곳으로 자주 사용되는 필드
  • 쿼리의 다른 테이블과 연결된 필드를 쿼리 하고 외래 키 관계에 대한 인덱스를 만듭니다.
  • 에서 정렬 된 필드 쿼리, 정렬 필드가 인덱스를 통해 액세스하는 경우, 정렬 속도가 크게 향상 될 것입니다
  • 그룹화를 정렬해야하기 때문에 쿼리의 통계 또는 그룹화 필드
  • 높은 동시성은 복합 인덱스를 생성하는 경향이 있습니다.

색인이 검색 및 정렬 기준 인 경우

4.6.2 색인을 생성 할 필요가없는 상황 :

  • 테이블 레코드가 너무 적습니다.
  • 자주 추가, 삭제 되는 테이블
  • 반복되고 균등하게 분산 된 데이터가있는 테이블 필드이므로 가장 자주 쿼리되고 가장 자주 정렬되는 데이터 열에 대한 인덱스 만 작성해야합니다. 데이터 열에 중복 콘텐츠가 많이 포함되어 있으면 인덱싱해도 실질적인 효과가 거의 없습니다.

인덱스 선택성은 테이블의 레코드 수에 대한 인덱스 열의 서로 다른 값 수의 비율을 나타냅니다. 테이블에 2000 개의 레코드가 있고 테이블 인덱스 열에 1980 개의 서로 다른 값이있는 경우이 인덱스의 선택도는 1980 / 2000 = 0.99입니다. 인덱스의 선택도가 1에 가까울수록 인덱스의 효율성이 높아집니다.

추천

출처blog.csdn.net/weixin_44634197/article/details/108902575