공개 번호를 팔로우하고 시의적절한 AI 최전선 프로젝트 도구와 새로운 기술 푸시를 받아보세요!
정보를 보내면 이커머스 시나리오와 연계하여 Redis 시나리오의 사용법을 설명하는 Redis 시리즈 문서에 대한 심층적인 이해, 미들웨어 시리즈 노트, 프로그래밍 고빈도 전자책을 받아볼 수 있습니다!
기사 가이드 주소:
MySQL을 배울 때 가장 많이 배우는 것은 B+ 트리 인덱스이지만 실제로는 해시 인덱스라는 다른 종류의 인덱스가 있습니다.
해시 인덱스는 어떻게 생성하나요?
여기서는 InnoDB 스토리지 엔진을 예로 사용합니다.
테이블을 만들고 특정 필드에 대한 인덱스를 추가할 때 다음과 같이 HASH 인덱스를 지정하는 경우입니다:
그러나 생성 당시 BTREE 인덱스가 마지막에 사용된 것으로 밝혀졌습니다.
확인 후에는 수동으로 해시 인덱스를 생성할 수 없습니다.
그렇다면 해시 인덱스는 언제 생성된 것일까요?
InnoDB의 해시 인덱스는 실제로 적응형 해시 인덱스일 뿐입니다.
특정 인덱스 값이 매우 자주 사용되는 경우 InnoDB가 자동으로 감지합니다.
특히 자주 실행되는 동일 값 쿼리의 경우, 적응형 해시 인덱스를 자동으로 생성하여 핫 데이터에 대한 액세스를 개선합니다.
해시 인덱스는 어떻게 구축했나요?
InnoDB는 특정 데이터 페이지가 너무 자주 호출되는 것을 발견하면 버퍼 풀의 섹션을 열어 적응형 해시 인덱스를 생성하여 쿼리 속도를 개선합니다.
적응형 해시 인덱스를 생성하면 인덱스를 통해 데이터를 찾는 경로를 단축할 수 있습니다.
적응형 해시 인덱스 관련 파라미터
innodb_adaptive_hash_index;
이 매개변수는 적응형 해시 인덱싱의 활성화 여부를 설정하며, 기본적으로 활성화되어 있습니다.
bashset persist innodb_adaptive_hash_index = on; set persist innodb_adaptive_hash_index = off;
innodb_adaptive_flushing;
이 매개변수는 더티 페이지 새로 고침을 제어하는 데 사용되며 기본적으로 활성화되어 있습니다.
이 기능을 활성화하면 InnoDB는 시스템 부하와 더티 페이지 수에 따라 더티 페이지 새로 고침 전략을 동적으로 조정하여 데이터 지속성을 보장하는 동시에 불필요한 디스크 IO를 줄이고 데이터베이스 성능을 개선합니다.
종료 시 InnoDB는 시스템이 유휴 상태일 때 불필요한 디스크 IO를 유발할 수 있는 전략인 더티 페이지를 주기적으로 디스크에 플러시하는 고정 새로 고침 전략을 사용합니다.
innodb_adaptive_flushing_lwm;
이 매개변수는 적응형 플러싱을 위한 더티 페이지 수를 제어하는 데 사용되는 로그 플러시 재실행의 저수위 표시를 설정하는 데 사용됩니다.
이 매개 변수로 임계값을 설정하여 더티 페이지 수가 임계값보다 적을 때 InnoDB가 새로 고침 빈도를 줄이도록 합니다.
를 10으로 설정하면 이 10은 더티 페이지 수와 InnoDB 버퍼 풀 크기의 비율을 나타냅니다. 즉, 더티 페이지 수가 버퍼 풀 크기의 10% 미만인 경우 InnoDB는 더티 페이지를 최소 0에서 최대 70%까지 덜 자주 플러시합니다.
공식 설명
적응형 해시 인덱스를 사용하면 InnoDB가 트랜잭션 특성과 안정성을 희생하지 않고도 적절한 워크로드와 충분한 버퍼 풀 메모리를 갖춘 인메모리 데이터베이스처럼 작동할 수 있습니다.
관찰된 검색 패턴을 기반으로 인덱스 키의 접두사를 사용하여 해시 인덱스가 구성되며, 이는 길이에 상관없고 B-트리의 특정 값에 대해서만 해시 인덱스에 나타날 수 있으며, 자주 액세스해야 하는 인덱스 페이지에 대해서는 필요에 따라 해시 인덱스가 구성됩니다.
테이블이 거의 전적으로 메모리에 맞는 경우, 해시 인덱스는 요소를 직접 조회하고 인덱스 값을 포인터로 변환하여 쿼리 속도를 향상시킬 수 있으며, InnoDB에는 인덱스 검색을 모니터링하는 메커니즘이 있으므로 InnoDB가 해시 인덱스로 쿼리를 더 빠르게 수행할 수 있음을 알아차리면 자동으로
경우에 따라 해시 인덱스의 속도 향상이 인덱스 모니터링 및 해시 인덱스 유지 관리 비용을 훨씬 능가하고, 워크로드가 많은 경우 적응형 해시 인덱스에 대한 액세스가 많은 연결 작업과 같은 경합의 원인이 될 수 있으며, Like 및 % 연산자 또한 해시 인덱스의 이점을 얻지 못하는 경향이 있으며, 이점이 없는 경우 적응형 해시 인덱스를 해제하여 불필요한 작업을 피할 수 있습니다. 불필요한 성능 오버헤드를 피하려면, 이를 활성화 및 비활성화한 상태로 벤치마크를 실행해 보세요!
적응형 해시 인덱스는 각 인덱스가 특정 파티션에 바인딩되고 각각 별도의 래치로 보호되며 파티션은 기본값이 8이고 최대 215인 innodb_adaptive_flushing_lwm; 제어되는 파티션으로 특징지어집니다.
innodb_adaptive_hash_index_parts; 통해 출력 SEMAPHORES를 확인하여 모니터링되는 적응형 해시 인덱스가 어떻게 사용되고 요청되는지 확인할 수 있으며, btr0sea.c에서 생성된 rw-latches를 기다리는 스레드가 많은 경우 적응형 해시 인덱스 파티션 수를 늘리거나 적응형 해시 인덱스를 비활성화하는 것을 고려할 수 있습니다.
