이노의 클러스터 인덱스 및 보조 인덱스 여기서의 MySQL] -depth 이해 (B + 트리 인덱스)

면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/wrs120/article/details/91126531

1. B + 트리 인덱스 분류

1.1 클러스터 된 인덱스

  A B + 트리를 구성하는 각 테이블의 기본 키에 따르면, 전체 테이블의 데이터 열을 저장하는 리프 노드 , 리프 노드 페이지 데이터는 각 데이터 페이지 사이의 양방향 연결 목록으로 연결되는 인덱스를 클러스터링한다. 데이터 페이지가 각 행의 모든 레코드에 저장되어있는 데이터 페이지가 아닌 오프셋 (offset)에 저장하고 데이터 페이지의 열쇠입니다. 테이블은 하나의 클러스터 된 인덱스를 가질 수 있습니다

  1. 데이터는 리프 노드에서 직접 확인할 수 있습니다
  2. 총 지수는 논리적으로 연속이기 때문에 검색 속도의 기본 정렬 키 조회 및 범위를 들어, 매우 빠릅니다. 예를 들어, 인해 B + 트리 인덱스 쿼리 10 데이터, 이중 다음 빠르게 데이터 페이지를 찾을 수 있습니다, 다음 10 개의 데이터의 마지막을 제거 목록에서 연결되어 있습니다

1.2 보조 인덱스

  각 테이블의 인덱스 열이 B + 트리를 생성하는 생성에있어서, 클러스터되지 않은 인덱스라고도 리프 노드는 데이터의 모든 행을 포함하지 않는다 . 잎 노드는 인덱스에 해당하는 데이터의 행을 찾기 위해 InnoDB 스토리지 엔진을 얘기하는 데 사용할 수있는 키와 북마크를 포함하는 데이터의 일반적으로 클러스터 된 인덱스 키 향양 행입니다. 각 테이블에는 여러 개의 보조 인덱스를 가질 수 있습니다

  쿼리가 보조 인덱스, 조회 과정을 통해 데이터를 찾을 경우 : 보조 지표의 우선 탐색 및 기본 키 기본 키 인덱스를 얻기 위해 포인터를 찾기 위해 리프 노드를 찾은 다음 기록의 전체 라인을 찾기 위해 기본 키 인덱스로 해당 페이지를 찾을 수 있습니다. 참고 : I는 3 개 차 인덱스 트리의 높이, 2의 클러스터 된 인덱스 트리의 높이로 한번 IO를, 쿼리를 실행하지 않은 쿼리 데이터는 3 + 2 IO 논리 데이터 페이지와 끝까지 보조 색인을 통해 수행됩니다


2.

2.1 공동 인덱스

  공동 인덱스는 B + 트리 있지만, 이러한 접합을 지표로 키, 복수의 수 (A, B)이며, B는에 대해 정렬되어 이해하는 방법 등과 같은 이차원 데이터 (3, 5) 키, 테이블은 다음 문장 생성 오른쪽 (3,5)보다 크거나 같은)를 (3,5-보다 작게

create tablebuy_log (
	userid int Unsigned not null,
	num int,
	buy_date Date
)
//创建两个索引:userid,userid_2
Alter table buy_log add key(userid);   //userid
Alter table buy_log add (userid,num,buy_date)  //userid_2
  1. select * from buy_log where userid=2;보조 리프 노드의 인덱스는 하나의 키가 포함되어 있기 때문에 한 후 사용자 ID 인덱스를 사용 분석을 EXPLAIN, 페이지 이론적 이상의 레코드를 저장할 수 있습니다
  2. select * from buy_log where userid =1 and num=2 order by buy_date Desc limit 3후 분석 분류 여분의 쌍 매입 일을 할 수 분류되어 있기 때문에 매입 일 공동 인덱스를, (사용자 ID, NUM, 매입 일) 공동 인덱스 userid_2을 사용하지됩니다 설명한다. 당신이 인덱스 인덱스 사용자 ID를 강제하는 경우, 분석 후, 정렬 작업 Useing filesort을 할 것입니다 사용자 ID 인덱스 매입 일이 순서가 있기 때문에, 즉, 일종의 매입 일입니다
  3. select * from buy_log where userid =1 order by buy_date Desc limit 3이후 사용자 ID 인덱스를 사용 분석 EXPLAIN 인덱스 병용하고 정렬 작업 때문에 (사용자 ID, 매입 일)가 순서화되어되지

2.2 덮는 인덱스

  인덱스 범위라고도 보조 기록에서 얻을 수 있습니다 레코드를 클러스터 된 인덱스를 조회 할 필요없이 인덱스를 확인합니다 .
이 두 가지 이점이 포함 인덱스를 사용합니다 :

  1. 보조 인덱스는 클러스터 된 인덱스의 크기보다 훨씬 작은 전체 행에 대한 모든 정보를 포함하지 않는, 많은 양의 적은 IO 작업 할 수 있습니다
  2. 통계 작업을 수행 할 때, 통계는 클러스터 된 인덱스를 통해 나오지 않습니다, 보조 인덱스는 통계에 의해 달성뿐만 아니라 IO가 감소 될 수있다

테이블 및 인덱스 위에서 생성 한 다음 그림 표지 지수의 방법으로 사용 :

  1. select count(*) from buy_log후 사용자 ID 보조 인덱스를 사용, 분석을 EXPLAIN 후 인덱스는 사용하여 인덱스의 추가 포함하는 것입니다
  2. 여기서 buy_log에서 수 (*)를 선택 매입 일> = '가 2019년 1월 1일'및 매입 일이 < '2019년 6월 7일가' 통해 분석 EXPLAIN 조합 인덱스 (사용자 ID, NUM, 매입 일)에 사용될 수있다 정상적인 상황은 아니다 공동 인덱스를 수행하지만,이 통계 SQL 작업입니다 된 인덱스에 포함 된 정보를 사용할 수 있습니다, 당신은 원하는 결과를 얻을, 옵티마이 저는 공동 인덱스를 선택합니다 수 있습니다

2.3 최적화 인덱스 NA를 선택 : 전체 테이블 스캔을

  즉 데이터를 찾기 위해 인덱스를 사용하지 않는 것입니다,하지만 클러스터 된 인덱스를 스캔하여, 즉, 전체 테이블은 데이터를 얻기 위해 직접 스캔 할 수 있습니다. 이 상황에서 발생한 링크에 가입 찾기의 범위 등 다음 표는 그것을 통해 순서를 보여

select * from orderdetails where orderid > 10000 and orderid<102000;

  즉 단일 인덱스 (OrderID를) 위의 문장 데이터를 찾을 수있는 지표를 통해 알 수있을 것이다가, 미만 102,000의 10000 테이블의 순서가 공동 지수 (OrderID를, 제품 ID)가보다 큰 (OrderID를)를 정보 주문 번호 찾기 분석을 EXPLAIN 후하지만, 최적화 알고리즘은 사용자 ID 검색 인덱스 데이터를 선택하지 않았지만, 테이블 스캔 이유 즉, 차 클러스터 된 인덱스의 선택? ? ? 사용자가 선택한 데이터가 데이터의 전체 행을하기 때문에 지정된 데이터에 대한 후 ORDERID 인덱스 쿼리, 또한 데이터의 전체 행에 액세스 할 수있는 북마크를 찾을 필요가 있기 때문에, 보조 인덱스는, 우리가 조회 할 정보를 포함 할 수 없습니다. 데이터에 OrderID 인덱스가 순서대로 저장하지만되지만 다시 북마크 룩업 데이터 무질서, 따라서 개별 디스크에 판독된다. 거의 액세스하지 데이터의 양 (20 %), 최적화 알고리즘은 데이터를 찾을 수있는 클러스터 된 인덱스를 선택됩니다. 때문에 분산이보다 순차적 훨씬 빠르게 읽을
  인덱스의 경우 적용 할 수없는, 옵티마이 보조 인덱스의 경우를 선택 : 소량 인 보조 인덱스를 통해 데이터를 찾을 수 있지만, 디스크가있는 경우 신속하게 솔리드 스테이트 디스크 무작위 읽기 작업과 더 나은 성능으로 이어질 사용할 수있는 보조 인덱스를 확인 인덱스의 사용을 강제하는 키워드 FORCE 인덱스를

select * from orderdetails FORCE INDEX(userid) where orderid > 10000 and orderid<102000;

  사용하기 전에 이러한 문제가 발생하면 쿼리 시간을 사용, 런타임 검색이 때때로 인덱스를 칠 수 시간 필드 색인, 때로는 생명이없는,이 때 때리지 지금 이유를 이해하는 데이터의 양입니다 또한, 인덱스를 사용하여 이동하는 것입니다 강제로, 데이터베이스는 30 만 개 데이터가 전에 약 3 초 인덱스 약 1 초 의무 사용 후 인덱스 쿼리를 사용하지 않은있다


MySQL의 인덱싱 문제에 대한 자세한 내용은 다음을 참조 https://blog.csdn.net/wrs120/article/details/80711800을

추천

출처blog.csdn.net/wrs120/article/details/91126531