[SQL 독학] 인덱스 내부 작동 원리와 구조, 데이터 검색

2022. 7. 25. 12:01SQL

인덱스의 내부 작동 원리

이전에 말했듯 인덱스가 늘 좋은 것이

아니므로 정확히 판단하여 적절히

활용하는 것이 중요하다. 이때 내부 작동

원리를 이해하고 있으면 도움이 된다.

 

균형 트리의 개념

출처 : 한빛미디어 - 혼자 공부하는 SQL

'자료 구조'에 나오는 범용적으로 사용되는

데이터의 구조로 클러스터형/보조 인덱스 모두

내부적으로 균형 트리로 만들어진다.

 

여기서 데이터가 저장되는 공간을 노드라고 한다.

출처 : 한빛미디어 - 혼자 공부하는 SQL

루트 노드(페이지) : 가장 상위 노드

리프 노드(페이지) : 가장 마지막 존재 노드

중간 노드(페이지) : 루트와 리프 사이의 노드들

※ MySQL에서는 페이지라고 한다.

 

리프 페이지만 있는 경우 찾고 싶은 정보를

처음부터 끝까지, 전체 테이블 검색 방식으로

일일히 뒤져보는 수밖에 없다. 하지만 균형트리라면

무조건 루트 페이지부터 검색을 한다. 루트에서 몇 번째

리프 페이지에 해당 정보가 있을지 검색하고 바로 

해당 리프 페이지로 이동하여 찾기 시작한다.

데이터가 크면 클수록 유리해질 수밖에 없는 방식이다.

 

 

균형 트리의 페이지 변환

인덱스를 사용하면 SELECT는 빠르나

데이터 변경 작업은 느려진다.

데이터 변경 작업 : INSERT, UPDATE, DELETE

출처 : 한빛미디어 - 혼자 공부하는 SQL

그 이유가 위와 같이 페이지 분할

작업이 발생하기 때문이다.

 

 

인덱스 구조와 데이터 검색

클러스터형 인덱스

출처 : 한빛미디어 - 혼자 공부하는 SQL

USE market_db;
CREATE TABLE cluster  -- 클러스터형 테이블 
( mem_id      CHAR(8) , 
  mem_name    VARCHAR(10)
 );
INSERT INTO cluster VALUES('TWC', '트와이스');
INSERT INTO cluster VALUES('BLK', '블랙핑크');
INSERT INTO cluster VALUES('WMN', '여자친구');
INSERT INTO cluster VALUES('OMY', '오마이걸');
INSERT INTO cluster VALUES('GRL', '소녀시대');
INSERT INTO cluster VALUES('ITZ', '잇지');
INSERT INTO cluster VALUES('RED', '레드벨벳');
INSERT INTO cluster VALUES('APN', '에이핑크');
INSERT INTO cluster VALUES('SPC', '우주소녀');
INSERT INTO cluster VALUES('MMU', '마마무');

SELECT * FROM cluster;

ALTER TABLE cluster
    ADD CONSTRAINT 
    PRIMARY KEY (mem_id);

SELECT * FROM cluster;

출처 : 한빛미디어 - 혼자 공부하는 SQL

 

보조 인덱스

출처 : 한빛미디어 - 혼자 공부하는 SQL

USE market_db;
CREATE TABLE second  -- 보조 인덱스 테이블 
( mem_id      CHAR(8) , 
  mem_name    VARCHAR(10)
 );
INSERT INTO second VALUES('TWC', '트와이스');
INSERT INTO second VALUES('BLK', '블랙핑크');
INSERT INTO second VALUES('WMN', '여자친구');
INSERT INTO second VALUES('OMY', '오마이걸');
INSERT INTO second VALUES('GRL', '소녀시대');
INSERT INTO second VALUES('ITZ', '잇지');
INSERT INTO second VALUES('RED', '레드벨벳');
INSERT INTO second VALUES('APN', '에이핑크');
INSERT INTO second VALUES('SPC', '우주소녀');
INSERT INTO second VALUES('MMU', '마마무');

ALTER TABLE second
    ADD CONSTRAINT 
    UNIQUE (mem_id);

SELECT * FROM second;

출처 : 한빛미디어 - 혼자 공부하는 SQL

 

두 인덱스 모두 검색이 빠르다.

다만 클러스터형 인덱스가 조금 더 빨라

효율적이란 것을 알 수 있다.