데이터베이스 테이블의 검색 성능을 향상시키기 위해 사용되는 특별한 데이터 구조이다. 특정 데이터를 빠르게 찾아갈 수 있는 경로를 제공한다.
테이블 스페이스 > 데이터 파일 > 세그먼트 > 익스텐트 > 블록

SELECT 쿼리를 실행할 때 효율적.INSERT, UPDATE, DELETE 작업 시 인덱스도 함께 갱신되어야 함.| 인덱스 유형 | 설명 | 사용 예시 |
|---|---|---|
| 단일 컬럼 인덱스 | 하나의 컬럼만 기준으로 인덱스를 생성 | 고객 ID, 제품 코드 등 단일 검색 기준 |
| 결합 인덱스 | 두 개 이상의 컬럼을 조합하여 생성 | 이름 + 생년월일, 제품 + 카테고리 등 |
| 유니크 인덱스 | 중복을 허용하지 않는 인덱스 | 휴대폰 번호, 주민등록번호 등 고유 값 |
결합 인덱스는 컬럼의 순서가 중요하다.
-- 단일 컬럼 인덱스
CREATE INDEX idx_customer_name ON CUSTOMERS(name);
-- 결합 인덱스
CREATE INDEX idx_order_customer_date ON orders(customer_id, order_date);
-- 유니크 인덱스
CREATE UNIQUE INDEX idx_email ON users(email);
-- 인덱스 확인
SELECT index_name, table_name, uniqueness
FROM user_indexes;
-- WHERE table_name = 'CUSTOMERS';
-- 인덱스 삭제
DROP INDEX idx_customer_name;
SQL 작동 원리
SQL문 실행 Parsing Syntax 확인 Semantic(권한) 체크
Shared Pool 확인 Execution : Soft Parsing.
Optimization Execution : Hard Parsing.
WHERE 조건, JOIN, ORDER BY, GROUP BY에 자주 등장하는 컬럼.데이터를 삽입하거나 수정, 삭제할 때 인덱스 구조를 갱신해야 하므로, 쓰기 작업에는 적절하지 않을 수 있다.
SELECT 조건에 자주 사용되는 컬럼을 우선적으로 배치.= 연산자에 사용되는 컬럼을 우선적으로 배치.WHERE NAME = 'John' AND AGE > 30 (NAME, AGE) 순서로 인덱스 생성.데이터베이스에서 "인덱스를 타지 못한다."는 것은 활용할 수 있는 인덱스가 있음에도 불구하고, SQL 쿼리가 인덱스를 활용하지 않고 테이블 전체를 스캔(Table Full Scan)하여 데이터를 조회하는 경우를 의미한다.
결과적으로는 불필요한 데이터 검색으로 인해 성능 저하가 발생한다.
인덱스를 활용하지 못하게 하는 주요 원인은 다음과 같다.
인덱스 컬럼에 함수 또는 연산 사용.
-- 인덱스 컬럼 'salary'에 함수 적용
SELECT *
FROM employees
WHERE ROUND(salary) = 5000;
-- 해결 방법 : 함수 사용 제거
SELECT *
FROM employees
WHERE salary BETWEEN 4999.5 AND 5000.5;
데이터 타입 불일치.
-- 인덱스 컬럼 'employee_id'는 숫자 타입인데 문자로 비교
SELECT *
FROM employees
WHERE employee_id = '101';
-- 해결 방법 : 데이터 타입 일치
SELECT *
FROM employees
WHERE employee_id = 101;
와일드카드(%) 사용 위치.
-- 인덱스가 사용되지 않음
SELECT *
FROM customers
WHERE name LIKE '%John%';
-- 해결 방법 : 와일드 카드 제거 또는 앞부분 고정
SELECT *
FROM customers
WHERE name LIKE 'John%';
NULL 값 처리.
NULL 값을 저장하지 않기 때문에 Table Full Scan을 함.-- 인덱스를 사용할 수 없음
SELECT *
FROM employees
WHERE salary IS NULL;
-- 해결 방법 : NULL 값을 포함하는 별도 처리 필요
ALTER TABLE employees
MODIFY salary DEFAULT 0;
OR 조건이 포함된 경우.
UNION ALL을 활용함.-- 인덱스 활용 어려움
SELECT *
FROM employees
WHERE department_id = 10 OR manager_id = 5;
-- 해결 방법 : UNION ALL로 분리
SELECT *
FROM employees
WHERE department_id = 10
UNION ALL
SELECT *
FROM employees
WHERE manager_id = 5;