[SQL] INDEX (색인)

제훈·2024년 6월 27일
1

SW공학, DB

목록 보기
15/21

INDEX

검색 속도를 높이기 위해 사용하는 하나의 기술로 인덱스를 사용한다.

PK는 자동으로 인덱스가 부여된다. (고유 식별자이므로)

장점
1. 검색 속도가 빠르다
2. 테이블 행의 고유성 강화

단점
1. DB의 추가적인 공간 필요
2. 인덱스 된 필드에서 데이터를 변동할 때 성능이 떨어진다.
3. 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.


응용

그럼 일단 phone 테이블을 만들고, 데이터를 넣어서 조회해보자.

CREATE TABLE phone (
  phone_code INT PRIMARY KEY,
  phone_name VARCHAR(100),
  phone_price DECIMAL(10,2)
);

INSERT
  INTO phone
VALUES
(1, 'galaxyS24', 1200000),
(2, 'iphone14pro', 1430000),
(3, 'galaxyfold3', 1730000);

SELECT * FROM phone;

phone_codd -> phone_code
galaxy24 -> galaxyS24


where 절을 활용한 단순 조회

SELECT * FROM phone WHERE phone_name = 'galaxyS24';
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS24';


Index 추가

where 절과 마찬가지로 phone_name 으로 Index 만들어보자.

CREATE INDEX idx_name ON phone(phone_name);

SHOW INDEX FROM phone;

이렇게 보이는데, cardinality전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표이다.

Cardinality : 구분할 수 있는 개수 를 의미한다.
즉, phone_code1, 2, 3 -> 3개
phone_name : galaxyS24, iphone14pro, galaxyfold3 -> 3개
phone_price : ... -> 3개
구분할 수 있는 개수가 3개로 동일한 상태이므로 3으로 나온다.

Cardinality 추가 예시)
마커의 색상 : 빨간색, 파란색, 초록색, 노란색, 주황색 -> 5개
사용하는 프로그래밍 언어 : Java, Python, Java, C, C -> 3개


다시 index가 추가된 column으로 조회해서 index를 태웠는지 확인해보자.

SELECT * FROM phone WHERE phone_name = 'galaxyS24';
EXPLAIN SELECT * FROM phone WHERE phone_name = 'galaxyS24';


INDEX 최적화

주기적으로 한 번씩 index를 rebuild 해줘야 한다.

  • 인덱스 최적화(재구성)은 인덱스가 파편화되었거나, 데이터의 대부분이 변경된 경우에 유용하다.
  • 이는 인덱스의 성능을 개선하고, 디스크 공간을 더 효율적으로 사용하게 해준다.
  • 단, 인덱스를 재구성하는 동안 해당 테이블은 잠길 수 있으므로, 이 작업은 주의해서 수행해야 한다.
ALTER TABLE phone DROP INDEX idx_name;
ALTER TABLE phone ADD INDEX idx_name(phone_name);

MySQL의 INNODB 를 사용하는 경우에는 최적화를 간단한 명령으로 할 수 있다.

OPTIMIZE TABLE phone;

profile
백엔드 개발자 꿈나무

0개의 댓글