본문 바로가기
Programming/SQL

[SQL] Index(인덱스) 사용법 및 예시

by 코딩하는 금융인 2024. 7. 13.

안녕하세요.

오늘은 책의 색인처럼 유용하게 쓰일 수 있는 SQL Index에 대해 알아보겠습니다.

 

 SQL 인덱스 개념 및 실습 예시

▣ 인덱스(Index)란?

데이터베이스(DB) 테이블의 검색 속도를 향상시키기 위한 데이터 구조

 

 - DB 내 인덱스특정 열의 값과 해당 레코드의 위치 데이터를 저장

 - 장점 : 정렬 작업 최적화(성능 향상), 고유성 보장(중복 데이터 방지)

 - 단점 : 추가 저장 공간 필요, 쓰기 작업 성능 저하, 유지보수 등 관리 부담

 - 대규모 데이터를 다룰 때는 인덱스의 단점을 훨씬 상회할 정도로 사용여부가 검색속도면에서 차이가 남

 

▣ SQL 실습해보기

: Employees 테이블 예시

CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Email VARCHAR(100),
    Department VARCHAR(50),
    Salary DECIMAL(10, 2)
);

-- 샘플 데이터 삽입
INSERT INTO Employees VALUES
(1, 'John', 'Doe', 'john.doe@example.com', 'IT', 75000),
(2, 'Jane', 'Smith', 'jane.smith@example.com', 'HR', 65000),
(3, 'Mike', 'Johnson', 'mike.johnson@example.com', 'Sales', 80000),
(4, 'Emily', 'Brown', 'emily.brown@example.com', 'IT', 72000),
(5, 'David', 'Wilson', 'david.wilson@example.com', 'Marketing', 68000);

 

 - 'LastName' 열에 인덱스 생성 및 특정값 조회하기

CREATE INDEX idx_LastName ON Employees(LastName)
SELECT * FROM Employees WHERE LastName = 'Smith';

 

 - MySQL 환경에서는 해당 쿼리에서 인덱스 사용 여부를 확인할 수 있음 (EXPLAIN)

EXPLAIN SELECT * FROM Employees WHERE LastName = 'Smith';

 

 - 하나의 열뿐만 아니라 복수의 열도 인덱스 설정 가능

CREATE INDEX idx_lastname_firstname ON Employees(LastName, FirstName);

EXPLAIN SELECT * FROM Employees WHERE LastName = 'Smith' AND FirstName = 'Jane';
+----+-------------+-----------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys       | key                 | key_len | ref         | rows | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | Employees | NULL       | ref  | idx_lastname_firstname | idx_lastname_firstname | 204     | const,const |    1 |   100.00 | Using index |
+----+-------------+-----------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------------+

 

 - 커버링 인덱스를 활용하면, 테이블 접근 없이 인덱스만으로 처리할 수 있음

CREATE INDEX idx_covering ON Employees(LastName, FirstName, Salary);

EXPLAIN SELECT LastName, FirstName, Salary FROM Employees WHERE LastName = 'Smith';

 

 - 'Using index'커버링 인덱스가 활용되어 테이블 접근 없이 쿼리가 처리되었음을 알 수 있음

+----+-------------+-----------+------------+------+---------------------+-------------+---------+-------+------+----------+-------------+
| id | select_type | table     | partitions | type | possible_keys       | key         | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-----------+------------+------+---------------------+-------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | Employees | NULL       | ref  | idx_covering        | idx_covering | 152     | const |    1 |   100.00 | Using index |
+----+-------------+-----------+------------+------+---------------------+-------------+---------+-------+------+----------+-------------+

 

 

반응형

댓글