>데이터 베이스 >MySQL 튜토리얼 >mysql 클러스터형 인덱스와 비클러스터형 인덱스의 차이점은 무엇입니까

mysql 클러스터형 인덱스와 비클러스터형 인덱스의 차이점은 무엇입니까

青灯夜游
青灯夜游원래의
2022-03-01 14:51:3321164검색

차이점: 1. 클러스터형 인덱스는 테이블의 리프 노드에 데이터를 저장하는 반면, 비클러스터형 인덱스는 기본 키와 인덱스 열을 리프 노드에 저장합니다. 2. 테이블의 순서는 클러스터형 인덱스에 기록됩니다. 3. 각 테이블은 클러스터형 인덱스를 하나만 가질 수 있지만 비클러스터형 인덱스는 여러 개 있을 수 있습니다.

mysql 클러스터형 인덱스와 비클러스터형 인덱스의 차이점은 무엇입니까

이 튜토리얼의 운영 환경: windows7 시스템, mysql8 버전, Dell G3 컴퓨터.

MySQL의 Innodb 스토리지 엔진의 인덱스는 클러스터형 인덱스와 비클러스터형 인덱스의 두 가지 범주로 구분됩니다. 중국어 사전의 인덱스를 비교하면 클러스터형 인덱스와 비클러스터형 인덱스를 이해할 수 있습니다. 중국어 사전은 한자를 검색하는 두 가지 방법을 제공합니다. 첫 번째는 병음 검색입니다(한자의 발음이 알려진 경우). 예를 들어 병음이 cheng인 한자는 병음이 있는 한자 뒤에 순위가 지정됩니다. chang. 해당 한자의 페이지 번호는 병음을 기반으로 검색됩니다(병음 정렬을 누르면 이진 검색이 빠르게 찾을 수 있기 때문입니다). 이는 우리가 일반적으로 사전 순서라고 부르는 두 번째 유형으로 해당 중국어를 찾습니다. 획에 따라 문자를 찾아, 한자에 해당하는 페이지 번호를 찾아보세요. 병음 검색은 획 색인에서 동일한 획을 가진 단어가 인접하더라도 저장된 레코드(데이터베이스의 행 데이터, 사전의 한자 세부 기록)가 이 색인에 따라 정렬되므로 클러스터형 색인입니다. 실제 저장소 페이지 번호가 인접하지 않습니다. 이는 비클러스터형 인덱스입니다.

Clustered Index

인덱스에 있는 키 값의 논리적 순서에 따라 테이블에서 해당 행의 물리적 순서가 결정됩니다.

클러스터형 인덱스는 테이블에 있는 데이터의 물리적 순서를 결정합니다. 클러스터형 인덱스는 성별로 데이터를 정렬하는 전화번호부와 유사합니다. 클러스터형 인덱스는 범위 값이 자주 검색되는 열에 특히 효과적입니다. 클러스터형 인덱스를 사용하여 첫 번째 값이 포함된 행을 찾으면 후속 인덱스 값이 포함된 행이 물리적으로 인접해 있는지 확인할 수 있습니다. 예를 들어, 응용 프로그램이 특정 날짜 범위 내의 레코드를 자주 검색하는 쿼리를 수행하는 경우 클러스터형 인덱스를 사용하여 시작 날짜가 포함된 행을 빠르게 찾은 다음 종료 날짜에 도달할 때까지 테이블에서 인접한 모든 행을 검색할 수 있습니다. 이는 그러한 쿼리의 성능을 향상시키는 데 도움이 됩니다. 마찬가지로, 테이블에서 검색된 데이터를 정렬할 때 열이 자주 사용되는 경우 해당 열을 쿼리할 때마다 테이블을 정렬할 필요가 없으므로 테이블을 해당 열에 클러스터링(물리적으로 정렬)할 수 있어 비용을 절약할 수 있습니다.

위는 innodb의 b+tree 인덱스 구조입니다

우리는 b-tree에서 진화한 것으로 알고 있습니다. m-order B-Tree는 다음과 같은 특성을 갖습니다.

1. 최대 m개의 하위 노드를 가질 수 있습니다.
2. 루트 노드와 리프 노드를 제외하고 각 노드에는 최소 m/2(반올림) 하위 노드가 있습니다.
3. 루트 노드가 리프 노드가 아닌 경우 루트 노드에는 두 개 이상의 하위 노드가 포함됩니다.
4. 모든 리프 노드는 동일한 레이어에 위치합니다.
5. 각 노드에는 k개의 요소(키워드)가 포함되어 있습니다. 여기서 m/2≤k6. 각 노드의 요소(키워드)는 작은 것부터 큰 것 순으로 배열됩니다.
7. 각 요소(키워드)의 왼쪽 노드 값은 해당 요소(키워드)보다 작거나 같습니다. 오른쪽 노드의 값은 해당 요소(키워드)보다 크거나 같습니다.

b+tree의 특징은 다음과 같습니다.

1. 모든 리프가 아닌 노드는 키워드 정보만 저장합니다.
2. 모든 위성 데이터(특정 데이터)는 리프 노드에 저장됩니다.
3. 모든 리프 노드에는 모든 요소에 대한 정보가 포함됩니다.
4. 모든 리프 노드 사이에는 링크 포인터가 있습니다.

b+trre에는 다음과 같은 특징이 있음을 발견했습니다.

  • 는 (리프 체인 포인터를 통해) 범위 내의 쿼리에 대해 특히 효과적이고 빠릅니다.
  • 특정 키 값에 대한 쿼리는 b보다 약간 덜 효율적입니다. -tree(리프 수준 때문에), 무시할 수도 있습니다.

비클러스터형 인덱스

 인덱스에 있는 인덱스의 논리적 순서는 디스크 업스트림의 물리적 저장 순서와 다릅니다.

실제로는 클러스터형 인덱스 이외의 인덱스도 정의상 비클러스터형 인덱스인데 사람들은 비클러스터형 인덱스를 일반 인덱스, 고유 인덱스, 전체 텍스트 인덱스로 세분화하고 싶어합니다. 논클러스터형 인덱스를 실생활의 어떤 것과 비교해야 한다면 논클러스터형 인덱스는 신화사전의 급진적 사전과 같으며 그 구조적 순서가 실제 저장 순서와 반드시 일치하지는 않습니다.

비클러스터형 인덱스의 저장 구조는 이전과 동일합니다. 차이점은 리프 노드의 데이터 부분에 더 이상 특정 데이터가 저장되지 않고 데이터의 클러스터형 인덱스 키가 저장된다는 점입니다. 따라서 비클러스터형 인덱스를 통한 검색 과정은 먼저 인덱스 키에 해당하는 클러스터형 인덱스의 키를 찾은 후, 클러스터형 인덱스의 키를 이용하여 기본키 인덱스 트리에서 해당 데이터를 찾는 것이다. 그 과정을 테이블 반납이라고 합니다!

예를 들어주세요:

create table student (

`id` INT UNSIGNED AUTO_INCREMENT,

`username` VARCHAR(255),
`score` INT,
PRIMARY KEY(`id`), KEY(`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

클러스터형 인덱스 클러스터형 인덱스(id), 비클러스터형 인덱스 인덱스(사용자 이름).

使用以下语句进行查询,不需要进行二次查询,直接就可以从非聚集索引的节点里面就可以获取到查询列的数据。

select id, username from t1 where username = '小明'
select username from t1 where username = '小明'

但是使用以下语句进行查询,就需要二次的查询去获取原数据行的score:

select username, score from t1 where username = '小明'

聚集索引和非聚集索引区别

区别一:

聚集索引:就是以主键创建的索引,在叶子节点存储的是表中的数据

非聚集索引:就是以非主键创建的索引(也叫做二级索引),在叶子节点存储的是主键和索引列。

区别二:

聚集索引中表记录的排列顺序和索引的排列顺序一致;所以查询效率快,因为只要找到第一个索引值记录,其余的连续性的记录在物理表中也会连续存放,一起就可以查询到。缺点:新增比较慢,因为为了保证表中记录的物理顺序和索引顺序一致,在记录插入的时候,会对数据页重新排序。

非聚集索引中表记录的排列顺序和索引的排列顺序不一致。

区别三:

聚集索引是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储不连续。

区别四:

聚集索引每张表只能有一个,非聚集索引可以有多个。

【相关推荐:mysql视频教程

위 내용은 mysql 클러스터형 인덱스와 비클러스터형 인덱스의 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.