MySQL에는 btree와 hash라는 두 개의 인덱스가 있다는 것을 알고 있습니다. 이 기사에서는 MySQL의 두 가지 인덱스 유형인 btree와 hash 간의 차이점을 간략하게 설명합니다. 해시 인덱스 구조의 특수성으로 인해 검색 효율성이 매우 높습니다. 인덱스 검색은 루트 노드에서 분기 노드까지 여러 번 IO 액세스가 필요한 B-Tree 인덱스와 달리 한 번에 찾을 수 있습니다. 페이지 노드, 해시 인덱스의 쿼리 효율성은 B-Tree 인덱스보다 훨씬 높습니다.
많은 사람들이 다시 질문을 할 수 있습니다. Hash 인덱스는 B-Tree보다 훨씬 효율적인데 왜 모든 사람이 Hash 인덱스를 사용하지 않고 B-Tree 인덱스를 사용합니까?
모든 것에는 양면이 있고 해시 인덱스는 동일합니다. 해시 인덱스는 효율성이 높지만 해시 인덱스 자체도 그 특수성으로 인해 다음과 같은 많은 한계와 단점을 가지고 있습니다.
(1) 해시 인덱스는 "=", "IN" 및 "<=>" 쿼리만 만족할 수 있으며 범위 쿼리는 사용할 수 없습니다.
해시 인덱스는 해시 연산 후 해시 값을 비교하기 때문에 등가 필터링에만 사용할 수 있고 범위 기반 필터링에는 사용할 수 없습니다. 해시 작업 전과 정확히 동일하다는 보장은 없습니다.
(2) 데이터 정렬 작업을 피하기 위해 해시 인덱스를 사용할 수 없습니다.
해시 인덱스는 해시 계산 후 해시 값을 저장하고, 해시 값의 크기 관계가 반드시 해시 연산 전 키 값과 정확히 동일할 필요는 없으므로 데이터베이스는 정렬 작업을 피하기 위해 인덱스 데이터를 사용할 수 없습니다.
(3) 부분 인덱스 키를 사용하여 해시 인덱스를 쿼리할 수 없습니다.
결합 인덱스의 경우 해시 인덱스의 해시 값을 계산할 때 해시 값을 별도로 계산하는 것이 아니라 결합된 인덱스 키를 병합한 후 함께 해시 값을 계산하므로 처음 하나 또는 여러 개를 통해 쿼리할 때 사용됩니다. 결합된 인덱스의 인덱스 키, 해시 인덱스도 활용될 수 없습니다.
(4) 해시 인덱스는 언제든지 테이블 스캔을 피할 수 없습니다.
앞서 알고 있듯이 해시 인덱스는 인덱스 키에 대해 해시 연산을 수행한 후 해시 연산 결과의 해시 값과 해당 행 포인터 정보를 해시 테이블에 저장하는 것입니다. 특정 Hash 키 값을 만족하는 레코드의 개수를 Hash 인덱스에서 직접 질의할 수 없더라도, 대신 테이블에 있는 실제 데이터에 접근하여 해당 비교를 하고 그에 따른 결과를 얻어야 한다.
(5) 해시 인덱스가 동일한 해시 값을 많이 만나면 성능이 반드시 B-Tree 인덱스보다 높지는 않습니다.
선택도가 낮은 인덱스 키의 경우 해시 인덱스를 생성하면 동일한 해시 값에 수많은 레코드 포인터 정보가 저장됩니다. 이런 식으로 특정 레코드를 찾는 것은 매우 번거롭고 테이블 데이터에 대한 다중 액세스를 낭비하게 되어 전반적인 성능이 저하됩니다.
위에서 btree 인덱스와 해시 인덱스의 차이점을 5가지 측면에서 소개했습니다. 다들 이해하셨으리라 생각하며, 업무에 활용하시길 바랍니다.
관련 권장 사항:
위 내용은 MySQL의 btree 인덱스와 해시 인덱스의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!