DataBase+SQL

SQL에서 인덱스를 활용한 데이터 조회 방법

campanula 2025. 2. 24. 13:26

1. 인덱스를 사용하면 왜 빠를까?

SQL에서 데이터를 조회할 때 인덱스(Index) 를 사용하면 검색 속도를 크게 향상시킬 수 있습니다. 인덱스는 책의 목차처럼 특정 컬럼의 값을 빠르게 찾을 수 있도록 도와줍니다.

🔍 인덱스의 동작 방식

데이터베이스에서 인덱스는 B-Tree 또는 Hash Table 등의 자료구조를 사용하여 데이터를 정리합니다. 이 덕분에 데이터를 찾을 때 Full Table Scan(전체 검색) 없이 필요한 데이터를 빠르게 찾을 수 있습니다.

예를 들어, 100만 개의 데이터가 있는 테이블에서 특정 이메일을 검색한다고 가정해봅시다.

  • 인덱스 없이 검색: 100만 개의 데이터를 하나씩 검사 → O(N) → 느림 🚫
  • 인덱스를 사용한 검색: 인덱스를 통해 원하는 데이터만 빠르게 검색 → O(log N) → 빠름 ✅

따라서, WHERE 절에서 인덱스가 적용된 컬럼을 활용하면 성능이 크게 향상됩니다.


2. 현재 테이블의 인덱스 확인하기

SQL에서 특정 테이블에 어떤 인덱스가 설정되어 있는지 확인하려면 다음 명령어를 사용합니다.

SHOW INDEX FROM 테이블명;

이 명령어를 실행하면 해당 테이블에 존재하는 인덱스 목록을 확인할 수 있습니다.

출력 결과 예시:

Table Non_unique Key_name Seq_in_index Column_name

users 0 PRIMARY 1 id
users 1 idx_email 1 email
  • PRIMARY: 기본 키(Primary Key)로 설정된 인덱스
  • idx_email: email 컬럼에 설정된 보조 인덱스

3. 인덱스를 활용한 SELECT 쿼리

인덱스가 적용된 컬럼을 WHERE 절에서 사용하면, 검색 성능이 향상됩니다.

SELECT * FROM users WHERE email = 'test@example.com';

이때, email 컬럼에 인덱스가 설정되어 있다면 데이터 검색 속도가 훨씬 빨라집니다.

📌 주의사항

  • LIKE '%검색어%' → ❌ (인덱스 사용 불가능, Full Table Scan 발생)
  • LIKE '검색어%' → ✅ (인덱스 사용 가능)
  • OR 조건 사용 시 인덱스가 비효율적으로 동작할 수 있음.

4. 인덱스가 실제로 사용되는지 확인 (EXPLAIN 활용)

SQL 실행 계획을 확인하면 인덱스가 실제로 적용되는지 확인할 수 있습니다.

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

출력 결과 예시:

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE users ref idx_email idx_email 767 const 1 Using index
  • key: 사용된 인덱스 (idx_email)
  • rows: 검색된 행 수 (1개)
  • Extra: Using index는 인덱스를 정상적으로 활용했다는 의미

5. 인덱스 생성 방법

테이블에 인덱스가 없다면, 직접 인덱스를 추가할 수 있습니다.

(1) 단일 컬럼 인덱스 생성

CREATE INDEX idx_email ON users(email);

이제 email 컬럼에 인덱스가 생성되어 검색 속도가 향상됩니다.

(2) 여러 개의 컬럼을 활용한 복합 인덱스 생성

CREATE INDEX idx_name_age ON users(name, age);

이 인덱스는 name과 age를 함께 검색할 때 성능을 높여줍니다.

📌 주의사항

  • (name, age) 인덱스가 있어도 age만 검색할 경우 인덱스를 활용하지 못할 수도 있음.

6. 인덱스 활용 시 주의할 점

인덱스는 성능을 향상시키지만, 무조건 많이 생성하는 것이 좋은 것은 아닙니다.

❌ 인덱스 남발 시 발생하는 문제

  1. 너무 많은 인덱스는 오히려 성능 저하를 유발 🚨
    • 인덱스가 많아지면, INSERT, UPDATE, DELETE 성능이 저하될 수 있음.
    • 새로운 데이터가 삽입될 때마다 인덱스를 업데이트해야 하므로 비용 증가.
  2. WHERE 절에서 인덱스를 활용할 수 있도록 쿼리 작성
    • LIKE '%검색어%' → ❌ (인덱스 사용 불가능)
    • LIKE '검색어%' → ✅ (인덱스 사용 가능)
    • OR 대신 UNION ALL 또는 IN을 활용하면 인덱스 최적화 가능.
  3. EXPLAIN을 활용하여 인덱스가 적용되는지 항상 확인
    • 실행 전에 EXPLAIN SELECT ...를 사용하여 인덱스가 제대로 동작하는지 체크!
  4. 컬럼 데이터가 너무 적은 경우 인덱스 효과가 미미함
    • 예를 들어 gender (남/여) 같은 값이 2~3개밖에 없는 경우, 인덱스를 사용해도 성능 향상 효과가 크지 않음.

7. 결론

인덱스는 검색 속도를 향상시키는 중요한 도구!
인덱스가 설정된 컬럼을 WHERE 절에서 사용하면 더 빠름!
EXPLAIN을 활용하여 인덱스가 사용되는지 꼭 확인!
불필요한 인덱스는 성능을 저하시킬 수 있으므로 주의!

SQL 인덱스를 적절히 활용하여 효율적인 데이터베이스 성능을 유지해보세요! 🚀