데이터베이스

9. 효율적 쿼리_인덱스 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 1. 19. 20:09

1. 인덱스

  • 테이블을 더 빠르게 조회하기 위한 참조 수단(책의 '찾아보기'와 유사)
  • 실무에서 매우 빈번히 사용 for 검색 속도 향상
  • 열 단위로 사용
  • 테이블을 가리키는 대상이기에 테이블 삭제되면 같이 삭제

2. 인덱스의 부작용

  • 인덱스를 저장할 추가적인 저장 공간 필요
  • 인덱스 작성 시간도 있다 : 행 데이터가 너무 많으면 이 시간이 오래 걸릴 수 있음
  • 검색(SELECT)가 아닌 작업(INSERT, UPDATE, DELETE)시 성능 악화

3. 인덱스의 종류

  • 클러스터형 인덱스(Clustered index)
    • PRIMARY KEY(우선 지정) / UNIQUE + NOT NULL 제약 조건 지정 시 자동 생성
    • 테이블 당 하나
    • 행 데이터가 인덱스로 지정된 데이터에 대해 자동 정렬
  • 보조 인덱스(Secondary index)
    • 테이블당 여러 개 가능
    • 중복 가능
    • 고유키로 지정된 칼럼은 자동으로 보조 인덱스가 생성(UNIQUE제약 조건)
    • 행 데이터가 인덱스로 지정된 데이터에 대해 자동 정렬X
# 인덱스 생성
CREATE INDEX 인덱스명 ON 테이블명 (열명);
CREATE INDEX 인덱스명 ON 테이블명 (열1, 열2);

# 인덱스 조회
SHOW INDEX FROM 테이블명;

# 인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
  • 예제
CREATE TABLE categories(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
);

INSERT INTO categories (name) VALUES
    ('Category 1'),
    ('Category 2'),
    ('Category 3'),
    ('Category 4'),
    ('Category 5'),
    ('Category 6'),
    ('Category 7'),
    ('Category 8'),
    ('Category 9'),
    ('Category 10');

-- 인덱스 확인
SHOW INDEX FROM categories;

-- 중복이 허용되는 INDEX 생성
CREATE INDEX idx_category_name ON categories(name);

-- 중복된 데이터가 있을 경우 INDEX 생성이 안됨
SELECT * FROM categories;
INSERT INTO categories(name) VALUES('Category 7');
CREATE UNIQUE INDEX idx_category_name2 ON categories(name);

DELETE FROM categories WHERE name = ('Category 7');

DROP INDEX idx_category_name2 ON categories;

-- 인덱스 적용 여부 확인
EXPLAIN SELECT * FROM categories WHERE name = 'Category 7';
DROP INDEX idx_category_name ON categories;
EXPLAIN SELECT * FROM categories WHERE name = 'Category 7';