본문 바로가기
Programming/Database

DB index와 B-tree

by 핏차 2024. 5. 7.

index?

조회하는 쿼리가 하나 있다. CUSTOMER 테이블의 튜플은 100만 개라고 해보자.

SELECT *
FROM customer
WHERE first_name = 'Minsoo';
  • first_name에 index가 걸려있지 않다면?
    • full scan(= table scan)으로 찾아야 한다.
    • 복잡도: O(N)
  • first_name에 index가 걸려있다면?
    • full scan보다 더 빨리 찾을 수 있다.
    • 복잡도: O(logN) (B-tree based index일 경우)

index를 사용하는 이유

: 조건을 만족하는 튜플(들)을 빠르게 조회하기 위해

: 빠르게 정렬(order by)하거나 그룹핑(group by)하기 위해

// 이런 쿼리문의 특정 조건을 만족하는 데이터들을 빠르게 탐색하기 위해
SELECT * FROM customer WHERE first_name = 'Minsoo';
DELETE FROM logs WHERE log_datetime < '2022-01-01';
UPDATE employee SET salary = salary * 1.5 WHERE dept_id = 1001;
SELECT * FROM employee E JOIN department D ON E.dept_id = D.id;

 


index 거는 법 (mysql 기준)

PLAYER table이 있다고 가정하자.

attribute는 (id, name, team_id, backnumber) 가 있다.

이 테이블을 조회하는 쿼리가 있다.

mysql> SELECT * FROM player WHERE name = 'Sonny';
mysql> SELECT * FROM player WHERE team_id = 105 and backnumber = 7;

이 때, index를 만들어 보자.

 

- 이미 테이블이 존재하고, 그 테이블에 인덱스를 추가하는 경우

// name은 중복 데이터가 있을 수 있으므로 (not unique) 그냥 인덱스
mysql> CREATE INDEX player_name_idx ON player (name);
			(인덱스 이름)	(테이블)  (어트리뷰트)
// 팀 내에서는 등번호가 같을 수 없으므로 team_id와 backnumber 두 개는 유니크한 식별자가 된다. 유니크 인덱스
mysql> CREATE UNIQUE INDEX team_id_backnumber_idx ON player (team_id, backnumber);

 

- 테이블을 생성할 때 인덱스를 같이 생성하는 경우

mysql> CREATE TABLE player (
    -> id		INT	    PRIMARY KEY,
    -> name		VARCHAR(20) NOT NULL,
    -> team_id		INT,
    -> backnumber	INT,
    -> INDEX player_name_idx (name),
    		(인덱스 이름 생략 가능)
    -> UNIQUE_INDEX team_id_backnumber_idx (team_id, backnumber)
    -> );
  • (team_id, backnumber)와 같이 두 개의 attribute에 인덱스를 생성하는 것을
    multicolumn index 또는 composite index라 한다.
  • 대부분의 RDBMS에서는, primary key에는 index가 자동 생성된다.

- 어떤 index가 걸려 있는지 확인하는 방법

mysql> SHOW INDEX FROM player;

 


index 동작 방식 (B-tree 기반)

 

 

 

 

 

 

 

index 사용 시 참고 사항

728x90

'Programming > Database' 카테고리의 다른 글

Database 기본 개념 파헤치기  (0) 2024.05.05