안녕하세요.
오늘은 책의 색인처럼 유용하게 쓰일 수 있는 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 |
+----+-------------+-----------+------------+------+---------------------+-------------+---------+-------+------+----------+-------------+
반응형
'Programming > SQL' 카테고리의 다른 글
[MySQL] LOAD DATA INFILE 대용량 데이터 불러오기 (2) | 2024.07.14 |
---|---|
[SQL] 파티셔닝 대용량 데이터 처리하기 (4) | 2024.07.12 |
[MySQL] 텍스트 검색(Full-Text Search) (2) | 2024.07.08 |
[MySQL] 쿼리 결과 변수로 설정하기 (82) | 2024.02.21 |
[MySQL] IP 주소 데이터 처리하기(INET_ATON, INET_NTOA) (76) | 2024.02.18 |
댓글