MySQL (InnoDB 분석) : 해시 알고리즘 및 적응 형 해시 인덱스

하나, 해시 알고리즘

  • 해시 알고리즘은 일반적인 알고리즘이며 시간 복잡도는 O (1)이며 인덱스에있을뿐만 아니라 모든 데이터베이스 응용 프로그램에 데이터베이스 구조가 있습니다.

 

둘째, 해시 테이블

  • 해시 테이블은 해시 테이블이라고도하며 직접 주소 지정 테이블에서 개선 된 기능입니다. 먼저 직접 주소 지정 테이블을 살펴보십시오. 키워드의 전역 U가 상대적으로 작을 때 직접 주소 지정은 간단하고 효과적인 기술입니다. 애플리케이션에 참여하기 위해 동적 집합이 사용되며 각 요소에는 전역 U = {0,1, ..., m-1}에서 가져온 키워드가 있습니다. 또한 두 요소에 동일한 키워드가 없다고 가정합니다.
  • 배열 (즉, 직접 주소 지정 테이블) T [0 ... m-1]은 각 위치 (또는 슬롯 또는 버킷)가 전역 U의 키에 해당하는 동적 집합을 나타내는 데 사용됩니다. 그림 5-38은이 문제를 보여줍니다. 슬롯 K는 키가 k 인 세트의 요소를 가리 킵니다. 집합에 키 k의 요소가 없으면 T [k] = NULL

  • 직접 주소 지정에는 명백한 문제가 있습니다. 도메인 U가 매우 큰 경우 일반적인 컴퓨터의 사용 가능한 용량의 제한으로 인해 컴퓨터에 크기 U의 테이블 T를 저장하는 것은 약간 비현실적이거나 불가능합니다. 저장 될 실제 키워드 세트 K가 U에 비해 ​​상대적으로 작 으면 T에 할당 된 대부분의 공간이 낭비됩니다.
  • 따라서 해시 테이블이 나타납니다. 해시 모드에서는 요소가 h (k)에 있습니다. 즉, 해시 함수 h를 사용하여 키 k에 따라 슬롯 위치를 계산하고 함수 h는 키 필드 U를 매핑합니다. 해시 함수 h. 아래 그림과 같이 그리스 테이블 T [0 ... m-1]의 슬롯에서

 

 

  • 해시 테이블 기술은 직접 주소 지정에서 발생하는 문제를 매우 잘 해결합니다. 그러나 여전히 작은 문제가 있습니다. 위의 그림과 같이 동일한 슬롯에 두 개의 키워드가 매핑 될 수 있습니다. 이 상황을 일반적으로 충돌이라고합니다. 가장 단순한 충돌 해결 기술이 일반적으로 데이터베이스에서 사용되며이 기술을 링크 방식이라고합니다.
  • 연결 방식에서는 동일한 슬롯에 해시 된 모든 요소가 연결 목록에 배치됩니다. 아래 그림과 같이 j에 해시 된 모든 요소에 대한 연결 목록의 선두를 가리키는 슬롯 j에 포인터가 있습니다. 그러한 요소가 없으면 j는 NULL입니다.

 

 

  • 마지막으로 고려해야 할 것은 해시 함수입니다. 해시 함수 h는 잘 해시 할 수 있어야합니다. 가장 좋은 경우는 충돌을 피하는 것입니다. 피할 수 없더라도 가장 작은 청두에서 충돌이 발생해야합니다. 일반적으로 키워드는 자연수로 변환 된 다음 나누기 해싱, 곱하기 해싱 또는 글로벌 해싱을 통해 구현됩니다. 해싱을 트리거하는 방법은 일반적으로 데이터베이스에서 사용됩니다.
  • 해시 함수의 분할 해싱 알고리즘에서 k의 나머지를 m으로 나누면 키 k가 m 슬롯 중 하나에 매핑됩니다. 즉, 해시 함수는 다음과 같습니다.

 

셋째, InnoDB 스토리지 엔진의 해시 알고리즘

  • 이노가 해시 알고리즘을 사용하여 사전을 찾아 , 그 충돌기구는 연결리스트 방식을 사용 하고, 해시 함수는 해시 분할 방식을 사용

InnoDB의 버퍼 페이지를 예로 들어

  • 버퍼 페이지의 해시 테이블의 경우 버퍼 풀 의 페이지 페이지에는 동일한 해시 함수 값이있는 페이지를 가리키는 체인 포인터가 있습니다. 분할 된 해시 의 경우 m 값은 버퍼 풀 페이지 수의 2 배보다 약간 큰 소수입니다.
  • 예를 들어, 현재 매개 변수 innodb_buffer_pool_size의 크기가 10M이면 총 640 개의 16KB 페이지가 있습니다.
    • 버퍼 풀 페이지 메모리의 해시 테이블의 경우 640 * 2 = 1280 슬롯을 할당해야하지만 1280이 소수가 아니기 때문에 1280보다 약간 큰 소수를 가져와야합니다. 1399가되어야하므로 1399입니다. 시작시 할당됩니다. 쿼리가있는 버퍼 풀의 페이지를 해시하는 데 사용되는 슬롯의 해시 테이블
  • 그렇다면 InnoDB의 버퍼 풀은 어떻게 페이지를 조회합니까? 위는 일반적인 알고리즘입니다. 검색 할 페이지를 자연수로 변환하는 방법은 무엇입니까?
    • 사실 이것은 매우 간단합니다 .InnoDB의 테이블 스페이스에는 space_id가 있습니다. 사용자가 쿼리하려는 것은 테이블 스페이스의 연속적인 16KB 페이지, 즉 오프셋 오프셋이어야합니다. InnoDB는 space_id를 왼쪽으로 20 비트 이동 한 다음 space_id와 오프셋, 즉 키워드 K = space_id << 2 + space_id + offset을 추가 한 다음 나누기로 각 슬롯에 해시합니다.

네, 적응 형 해시 인덱스

  • 적응 형 해시 인덱스는 앞에서 설명한 해시 테이블의 구현을 채택합니다. 차이점은 이것은 데이터베이스 자체에서만 생성 및 사용되며 DBA 자체는 개입 할 수 없다는 것입니다.
  • 해시 인덱스는 해시 함수에 의해 해시 테이블에 매핑되기 때문에 사전 유형 을 찾는 것이 매우 빠릅니다.
  • "SHOW ENGINE INNODB STATUS"명령 을 통해 적응 형 해시 인덱스의 현재 사용량을 볼있습니다. 예를 들면 다음과 같습니다.
    • 적응 형 해시 인덱스의 크기와 사용량, 초당 적응 형 해시 인덱스 검색의 사용을 볼 수 있습니다.
    • 해시 검색 / 초 및 비해시 검색 / 초 : 해시 인덱스 이후의 사용 및 효율성을 나타냅니다.

  • 적응 형 해시 인덱스는 InnoDB 스토리지 엔진 자체에 의해 제어되므로 여기에있는 정보는 참조 용입니다.
  • 참고 : 해시 인덱스 는 동등한 쿼리를 검색하는 데만 사용할 수 있습니다. 범위 조회의 경우 해시 인덱스를 사용할 수 없습니다.
-- 下面的查询语句可以使用自适应哈希索引
select * from table where index_col='xxx';

innodb_adaptive_hash_index 参数

  • 적응 형 해시 인덱스 사용 여부는이 매개 변수로 제어 할 수 있습니다.
  • 기본값은 켜져 있습니다.

 

 

 

추천

출처blog.csdn.net/m0_46405589/article/details/113815441