SQL에서 인덱스(index) 를 사용하면 데이터베이스가 데이터를 찾는 방식이 달라지면서 쿼리 성능이 크게 향상될 수 있습니다. 구체적으로 인덱스를 사용하면 다음과 같은 변화가 발생합니다
1. 데이터 검색 속도 향상
- 인덱스는 책의 목차와 유사한 역할을 합니다. 데이터베이스가 모든 데이터를 순차적으로 확인하는 전체 테이블 스캔(Full Table Scan)을 하지 않고, 인덱스를 통해 필요한 데이터의 위치를 빠르게 찾을 수 있습니다.
- 예를 들어, employees 테이블에서 name 컬럼을 기준으로 검색할 때 인덱스가 있으면, 데이터베이스는 테이블 전체를 검색하는 대신 인덱스를 사용해 빠르게 해당 name이 포함된 행을 찾아냅니다.
2. 정렬 및 그룹화 성능 향상
- ORDER BY, GROUP BY 등의 쿼리를 실행할 때, 정렬된 인덱스가 있으면 데이터베이스가 데이터를 이미 정렬된 상태로 찾을 수 있기 때문에, 정렬을 위한 추가 작업이 줄어듭니다.
- 예를 들어, SELECT * FROM employees ORDER BY salary 쿼리가 있을 때, salary 컬럼에 인덱스가 있으면 이미 정렬된 인덱스를 사용해 속도가 빨라집니다.
3. 특정 조건에서의 성능 향상
- WHERE 절에서 자주 사용하는 컬럼에 인덱스를 추가하면, 조건에 맞는 데이터를 빠르게 찾아서 성능을 개선할 수 있습니다.
- 예를 들어, SELECT * FROM employees WHERE age = 30이라는 쿼리를 실행할 때, age 컬럼에 인덱스가 있으면, 데이터베이스는 테이블을 한 번만 읽고 빠르게 결과를 반환할 수 있습니다.
4. 복합 조건에서의 성능 향상
- 여러 컬럼을 결합하여 복합 인덱스를 생성하면, 복잡한 조건을 포함하는 쿼리에서 성능이 향상됩니다.
- 예를 들어, SELECT * FROM employees WHERE name = 'John' AND age = 30 쿼리가 있을 때, name과 age 컬럼에 복합 인덱스가 있으면 더 빠르게 결과를 얻을 수 있습니다.
인덱스를 사용하면 어떻게 달라지나?
예시 1: 인덱스가 없을 때
테이블에 인덱스가 없다면, 데이터베이스는 해당 조건에 맞는 데이터를 순차적으로 찾아야 합니다. 이는 전체 테이블을 스캔(Full Table Scan)하는 방식이기 때문에, 데이터가 많을수록 시간이 많이 걸립니다.
SELECT * FROM employees WHERE name = 'John';
이 쿼리를 실행할 때, 인덱스가 없으면, 데이터베이스는 employees 테이블의 모든 행을 하나씩 읽으면서 name이 'John'인 행을 찾게 됩니다.
예시 2: 인덱스가 있을 때
인덱스가 있다면, 데이터베이스는 인덱스를 사용하여 빠르게 'John'을 찾습니다. 인덱스가 책의 목차처럼 필요한 데이터가 있는 위치를 알려주기 때문에, 전체 테이블을 스캔할 필요가 없습니다.
CREATE INDEX idx_name ON employees (name);
위와 같은 인덱스를 추가한 후, 같은 쿼리를 실행하면 인덱스 덕분에 검색 속도가 훨씬 빨라집니다.
인덱스를 사용하면 단점도 있을 수 있다
인덱스는 검색 성능을 크게 향상시킬 수 있지만, 몇 가지 단점도 있습니다:
- 쓰기 성능 저하
- 데이터베이스에 데이터를 삽입, 수정, 삭제할 때 인덱스를 갱신해야 하기 때문에, 쓰기 작업에서 오버헤드가 발생할 수 있습니다.
- 예를 들어, 새로운 데이터가 삽입될 때마다 인덱스도 업데이트되어야 하므로, 자주 수정되는 테이블에는 인덱스를 사용하기 어려울 수 있습니다.
- 디스크 공간 차지
- 인덱스를 추가하면, 인덱스 자체가 디스크 공간을 차지하게 됩니다. 인덱스가 많을수록 더 많은 디스크 공간을 사용하게 되므로, 디스크 공간을 관리할 때 주의가 필요합니다.
- 잘못된 인덱스 사용 시 성능 저하
- 불필요한 컬럼에 인덱스를 추가하거나, 잘못된 인덱스를 사용하면 오히려 성능이 떨어질 수 있습니다. 예를 들어, 자주 수정되는 컬럼에 인덱스를 추가하는 것은 피해야 합니다.
결론
SQL 인덱스를 사용하면 검색 성능을 크게 향상시킬 수 있으며, 테이블에서 데이터를 빠르게 찾을 수 있게 됩니다. 하지만 인덱스가 없는 경우, 전체 테이블을 순차적으로 검색하게 되므로 성능이 떨어질 수 있습니다. 인덱스 사용 시에도 자주 수정되는 컬럼에 인덱스를 추가하지 않기 등 적절히 관리하는 것이 중요합니다.
1. 인덱스 생성 예시
기본적인 인덱스 생성
CREATE INDEX idx_employee_name ON employees (name);
위 쿼리는 employees 테이블에서 name 컬럼에 인덱스를 생성하는 예제입니다. 이렇게 인덱스를 생성하면 해당 컬럼을 사용하는 검색 쿼리의 성능을 향상시킬 수 있습니다.
다중 컬럼 인덱스
CREATE INDEX idx_employee_name_age ON employees (name, age);
여러 컬럼을 결합하여 인덱스를 만들 수도 있습니다. 이 경우, name과 age를 함께 사용할 때 성능이 개선됩니다. 그러나 이 인덱스는 name 컬럼만 사용하는 검색 쿼리에서는 효과가 적을 수 있습니다.
2. 인덱스 사용 시 주의사항
2.1. 자주 변경되는 컬럼에 인덱스는 피하자
인덱스는 데이터를 수정할 때마다 추가적인 오버헤드를 발생시킵니다. 따라서 자주 수정되는 컬럼에 인덱스를 추가하는 것은 성능에 부정적인 영향을 줄 수 있습니다.
올바른 예시
- name, email, phone 등 자주 조회되는 컬럼에 인덱스를 추가합니다.
잘못된 예시
- last_login, updated_at 등 자주 변경되는 컬럼에 인덱스를 추가하면, 데이터 수정 시마다 인덱스를 갱신해야 하므로 성능이 저하됩니다.
2.2. 불필요한 인덱스는 피하자
데이터베이스에서 인덱스를 너무 많이 생성하면, 데이터 삽입 및 갱신 시에 성능 저하가 발생할 수 있습니다. 특히 자주 쿼리하지 않는 컬럼에 인덱스를 추가하는 것은 피해야 합니다.
올바른 예시
- 자주 조회되는 컬럼에만 인덱스를 추가하고, 필요하지 않은 컬럼에 인덱스를 추가하지 않습니다.
잘못된 예시
- 쿼리에서 잘 사용되지 않는 컬럼에 인덱스를 추가하여 불필요한 성능 부담을 주는 경우입니다.
2.3. LIKE 연산자에 인덱스 사용 시 주의
LIKE 연산자는 %가 앞에 붙은 경우(예: LIKE '%value')에 인덱스를 사용할 수 없습니다. 이런 경우, 인덱스는 효과를 발휘하지 못합니다. LIKE의 앞부분에만 %가 있을 때 인덱스를 사용할 수 있습니다.
올바른 예시
SELECT * FROM employees WHERE name LIKE 'John%';
위와 같은 쿼리에서는 name 컬럼에 인덱스가 사용됩니다.
잘못된 예시
SELECT * FROM employees WHERE name LIKE '%John';
이 쿼리는 LIKE의 앞부분에 %가 있어 인덱스가 무효화됩니다.
2.4. NULL 값이 포함된 컬럼에 인덱스 사용
NULL 값이 포함된 컬럼에 인덱스를 추가하는 것은 성능에 영향을 줄 수 있습니다. 일부 DBMS에서는 NULL 값을 처리하는 방식이 다르기 때문에 인덱스 성능이 저하될 수 있습니다.
올바른 예시
- NULL 값을 자주 조회할 필요가 없다면, NULL을 허용하는 컬럼에 인덱스를 추가하지 않는 것이 좋습니다.
잘못된 예시
- nullable_column이 자주 사용되는 컬럼이라면, NULL 값을 포함한 상태에서 쿼리 성능이 떨어질 수 있습니다.
3. 인덱스를 피해야 할 부정적인 조건
3.1. 전체 테이블 스캔을 유도하는 쿼리
인덱스는 주로 데이터를 빠르게 검색하기 위해 사용되지만, 전체 테이블을 스캔하는 쿼리에는 효과가 없을 수 있습니다. 예를 들어, ORDER BY나 GROUP BY와 같이 많은 데이터를 처리하는 경우 인덱스가 오히려 성능을 저하시킬 수 있습니다.
잘못된 예시
SELECT * FROM employees ORDER BY RAND();
위 쿼리는 테이블을 전부 스캔하여 데이터를 랜덤으로 정렬하므로 인덱스를 사용해도 성능이 개선되지 않습니다.
3.2. 작은 테이블에서 인덱스 사용
테이블이 매우 작은 경우, 인덱스를 사용해도 성능 차이가 크지 않습니다. 작은 데이터셋에서는 인덱스를 사용하지 않는 것이 더 효율적일 수 있습니다.
잘못된 예시
CREATE INDEX idx_small_table_name ON small_table (name);
작은 테이블에서 인덱스를 추가하는 것은 불필요한 오버헤드를 발생시킬 수 있습니다.
결론
SQL 인덱스를 잘 활용하면 쿼리 성능을 크게 향상시킬 수 있습니다. 하지만 인덱스를 무분별하게 사용하는 것은 오히려 성능을 저하시킬 수 있습니다. 위에서 설명한 부정적인 조건들을 잘 피하고, 인덱스를 적절히 관리하여 데이터베이스 성능을 최적화하세요.
'SQL' 카테고리의 다른 글
데이터 정규화(Normalization)란? (0) | 2025.02.13 |
---|---|
관계 데이터베이스에서의 관계수, 선택성, 식별자 상속 (0) | 2025.02.12 |
DECODE 함수란? (0) | 2025.02.05 |
DELETE와 TRUNCATE 차이 (0) | 2025.01.24 |
그룹 함수(Group Functions)와 GROUP BY 절 관련 특수사항 (0) | 2025.01.23 |