적응 형 해시 인덱스 (Adaptive Hash Index)

1.1 해시 인덱스 란?

  해시 인덱스는 해시 테이블을 기반으로 구현됩니다. 인덱스의 모든 열과 정확히 일치하는 쿼리 만 유효합니다. 각 데이터 행에 대해 스토리지 엔진은 모든 인덱스 열 값에 대한 해시 코드를 계산하고 해시 인덱스는 모든 해시 코드를 계산합니다. 인덱스에 저장되며 해시 테이블의 각 데이터 행에 대한 포인터를 저장합니다.

  • 해시 인덱스에는 해시 값과 행 포인터 만 포함되고 필드 값은 저장되지 않으므로 해시 인덱스는 인덱스 스캔을 포함하는 데 사용할 수 없습니다.
  • 해시 인덱스 데이터는 인덱스 열 값의 순서대로 저장되지 않으므로 정렬에 사용할 수 없습니다.
  • 해시 인덱스는 해시 값을 계산하기 위해 항상 인덱스의 모든 열 값을 사용하기 때문에 해시 인덱스는 부분 인덱스 열 일치 검색을 지원하지 않습니다. 해시 인덱스는 동등한 비교 쿼리 만 지원합니다.
  • 해시 충돌이 많지 않는 한 해시 인덱스 데이터에 대한 액세스는 매우 빠릅니다. 해시 충돌이있는 경우 스토리지 엔진은 연결된 목록의 모든 행 포인터를 탐색하고 적합한 모든 행을 찾을 때까지 행별로 비교해야합니다. 해시 충돌이 많은 경우 일부 인덱스 유지 관리 작업도 비용이 많이 듭니다.

1.2 적응 형 해시 인덱스 란?

  MySQL에서 해시 인덱스는 메모리와 NDB 엔진에서만 지원합니다. 메모리 엔진은 기본적으로 해시 인덱스를 지원합니다. 여러 해시 값이 동일하고 해시 충돌이 발생하면 인덱스가 연결 목록에 저장됩니다. 일반적으로 사용되는 InnoDB 엔진의 경우 해시 인덱스가 지원되지 않습니다 .InnoDB가 해시 인덱스를 지원하도록하려면 적응 형 해시 인덱스라고하는 의사 해시 인덱스로 구현할 수 있습니다.

  적응 형 해시 인덱스는 InnoDB가 일부 인덱스 값이 매우 자주 사용되는 것을 감지하면 메모리의 btree 인덱스를 기반으로 해시 인덱스를 생성하여 해시 검색을 수행 할 수 있다는 것입니다.

1.3 적응 형 해시 인덱스의 원리

  InnoDB 스토리지 엔진은 테이블의 인덱스 조회를 모니터링합니다. 해시 인덱스를 설정하면 속도가 향상 될 수있는 것으로 관찰되면 적응 형 해시 인덱스가 설정됩니다. 실현은 본질적으로 해시 테이블입니다. 특정 검색 조건에서 특정 데이터 페이지의 해시 테이블입니다.

인덱스는
  인덱스 트리에 대해 설정된 AHI를 17 회 이상 사용합니다 (AHI는 인덱스 트리에 레이어가 너무 많은 경우에만 효과적 일 수 있음). 인덱스가 한두 번만 사용되는 경우 AHI가 설정되어 혜택보다 AHI가 너무 많고 유지 관리 비용이 더 많이 듭니다. 인덱스가 17 회 이상 사용되면 필터를 통과합니다.

해시 정보는
  17 회 이상 사용되는 인덱스에 대한 해시 정보를 생성하기 위해 100 회 이상 사용되며, 검색 조건과 인덱스 간의 일치 정도를 설명하는 데 사용됩니다. AHI를 구축 할 때 매칭 정도에 따라 데이터에서 매칭되는 부분을 추출하여 AHI의 키로 사용할 수 있습니다. 해시 정보 사용 횟수가 100 회 이상이면 해시 정보가 자주 사용된다는 의미입니다.

  • 해시 정보 구조 : 일치하는 인덱스 열 수, 다음 열에서 일치하는 바이트 수, 왼쪽부터 일치할지 여부.

해시 정보가 1/16보다 큰 페이지 데이터에
  도달하면 테이블의 모든 데이터에 대해 AHI를 생성하면 AHI가 캐싱의 의미를 잃게되므로 인덱스 트리에서 자주 사용되는 데이터 페이지를 찾아야하며이 단계를 통해 필터링 한 후 시작할 수 있습니다. 해시 인덱스를 작성하십시오.

1.4 관련 변수

mysql>  show variables like '%hash%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| innodb_adaptive_hash_index       | ON    |
| innodb_adaptive_hash_index_parts | 8     |
+----------------------------------+-------+
2 rows in set (0.00 sec)
#innodb_adaptive_hash_index:控制innodb自适应哈希索引特性是否开启参数
innodb_adaptive_hash_index_parts:凡是缓存都会涉及多个缓存消费者间的锁竞争。MySQL通过设立多个AHI分区,每个分区使用独立的锁,来减少锁竞争。

1.5 모니터링 표시기

-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
 #这行显示自适应哈希索引的状态,其中,Hash table size 276707表示AHI的大小, node heap has 629 buffer(s)表示AHI的使用情况
Hash table size 276707, node heap has 2 buffer(s)
Hash table size 276707, node heap has 629 buffer(s)
Hash table size 276707, node heap has 1 buffer(s)
Hash table size 276707, node heap has 0 buffer(s)
Hash table size 276707, node heap has 1 buffer(s)
Hash table size 276707, node heap has 0 buffer(s)
Hash table size 276707, node heap has 2 buffer(s)
Hash table size 276707, node heap has 4 buffer(s)
#这行显示了在show engine头部的时间内Innodb每秒完成了多少哈希索引操作,3999.00 hash  searches/s表示每秒使用AHI搜索的情况,2326.97 non‐hash searches/s表示 每秒没有使用AHI搜索的情况(因为哈希索引只能用于等值查询,而范围查询,模糊查询是不能使用哈希索引的。),通过hash searches: non‐hash searches 的比例大概可以了解使用哈希索引后的效率,自适应哈希索引无法配置,但是可以通过 innodb_adaptive_hash_index=ON|OFF参数来选择是否需要这个特性
3999.00 hash searches/s, 2326.97 non-hash searches/s

  사업체의 AHI 이용률이 너무 낮은 경우 AHI 구축 원칙을 이해 한 후 사업체가 AHI에 도달하지 않는 이유를 분석하여 액세스 모드를 변경해야하는지, 데이터를 고온 및 저온으로부터 격리해야하는지 여부를 판단 할 수 있습니다. AHI 유지 비용을 줄이기 위해 AHI를 종료하는 것도 고려할 수 있습니다.

1.6 요약

  • MySQL은 데이터 페이지 쿼리를위한 캐시로 AHI를 도입했으며 데이터 페이지 쿼리 비용을 줄이고 자했습니다.

  • AHI "적응 형"이 해결하고자하는 문제는 캐시가 너무 크거나 작을 수 없다는 것입니다.

  • AHI 설정시 지속적인 제한을 통해 자주 사용되는 인덱스와 자주 사용되는 데이터 페이지 만 캐시됩니다.

추천

출처blog.csdn.net/qq_42979842/article/details/108041608