인덱스는 데이터베이스에서 특정 조건을 만족하는 데이터를 빠르게 찾기 위해 사용하는 자료구조입니다. 예를 들어, 100만 개의 데이터 중에서 first name이 '민수'인 사람을 찾는 쿼리가 있을 때, 인덱스가 없다면 모든 데이터를 하나씩 확인해야 합니다. 이를 "풀스캔(Table Scan)"이라고 하며, 이 경우 시간 복잡도는 O(n)입니다.
하지만 first name에 인덱스가 걸려 있다면, 비트리(B-tree) 같은 자료구조를 통해 데이터를 훨씬 더 빠르게 찾을 수 있습니다. 이때 시간 복잡도는 O(log n)으로 줄어들어 성능이 크게 향상됩니다.
예를 들어, 다음과 같은 쿼리가 있다고 가정해 봅시다:
SELECT * FROM Customers WHERE first_name = '민수';
이 쿼리에서 first_name 컬럼에 인덱스가 있으면, 데이터베이스는 인덱스를 사용해 '민수'라는 이름을 가진 고객을 빠르게 찾을 수 있습니다.
MySQL에서 인덱스를 생성하는 방법을 살펴보겠습니다. 예를 들어, 다음과 같은 Players 테이블이 있다고 가정해 봅시다:
CREATE TABLE Players (
id INT PRIMARY KEY,
name VARCHAR(255),
team_id INT,
jersey_number INT
);
여기서 name 컬럼에 인덱스를 걸고 싶다면 다음과 같이 명령문을 작성할 수 있습니다:
CREATE INDEX idx_name ON Players(name);
또한 여러 컬럼을 조합한 인덱스를 생성할 수도 있습니다. 예를 들어, team_id와 jersey_number를 조합한 인덱스는 다음과 같이 생성할 수 있습니다:
CREATE UNIQUE INDEX idx_team_jersey ON Players(team_id, jersey_number);
이러한 인덱스는 team_id와 jersey_number를 결합하여 특정 선수를 빠르게 찾는 데 유용합니다.
안녕하세요! 이번 블로그 포스트에서는 데이터베이스에서 인덱스란 무엇인지, 그리고 인덕스를 어떻게 활용하고 동작하는지에 대해 설명드리겠습니다. 인덱스를 잘 활용하면 쿼리 성능을 크게 향상시킬 수 있습니다. 그럼 시작해볼까요?
인덱스는 데이터베이스에서 특정 조건을 만족하는 데이터를 빠르게 찾기 위해 사용하는 자료구조입니다. 예를 들어, 100만 개의 데이터 중에서 특정 first name이 '민수'인 사람을 찾는 쿼리가 있을 때, 인덱스가 없다면 모든 데이터를 하나씩 확인해야 합니다. 이를 풀스캔(Table Scan)이라고 하며, 이 경우 시간 복잡도는 O(n)입니다.
하지만 first name에 인덱스가 걸려 있다면, 비트리(B-tree) 같은 자료구조를 통해 데이터를 훨씬 더 빠르게 찾을 수 있습니다. 이때 시간 복잡도는 O(log n)으로 줄어들어 성능이 크게 향상됩니다.
예를 들어, 다음과 같은 쿼리가 있다고 해보겠습니다:
SELECT * FROM Customers WHERE first_name = '민수';
위 쿼리에서 first_name 컬럼에 인덱스가 있으면, 데이터베이스는 인덱스를 사용해 '민수'라는 이름을 가진 고객을 빠르게 찾을 수 있습니다.
MySQL에서 인덱스를 생성하는 방법을 알아보겠습니다. 예를 들어, 다음과 같은 Players 테이블이 있다고 가정해 봅시다:
CREATE TABLE Players (
id INT PRIMARY KEY,
name VARCHAR(255),
team_id INT,
jersey_number INT
);
여기서 name 컬럼에 인덱스를 걸고 싶다면 다음과 같이 명령문을 작성할 수 있습니다:
CREATE INDEX idx_name ON Players(name);
또는 여러 컬럼을 조합한 인덱스를 생성할 수도 있습니다. 예를 들어, team_id와 jersey_number를 조합한 인덱스는 다음과 같이 생성할 수 있습니다:
CREATE UNIQUE INDEX idx_team_jersey ON Players(team_id, jersey_number);
이러한 인덱스는 team_id와 jersey_number를 결합하여 특정 선수를 빠르게 찾는 데 유용합니다.
비트리 기반 인덱스는 데이터를 정렬된 상태로 저장하며, 특정 값을 찾을 때 이진 탐색(Binary Search)을 사용하여 빠르게 접근합니다. 예를 들어, a = 9인 데이터를 찾으려면 인덱스에서 가운데 값을 기준으로 검색을 시작하고, 점차 범위를 좁혀가며 값을 찾습니다.
또한, 다중 컬럼 인덱스를 만들면 인덱스는 첫 번째 컬럼을 기준으로 먼저 정렬되고, 그다음에 두 번째 컬럼이 정렬됩니다. 예를 들어, a, b로 이루어진 인덱스가 있다면 a가 우선 정렬되고, a가 동일한 경우에만 b로 정렬됩니다.
하지만, b만으로 검색할 경우 이 인덱스를 사용할 수 없기 때문에 추가적인 인덱스를 고려해야 할 수 있습니다.
MySQL에서 현재 테이블에 어떤 인덱스가 존재하는지 확인하려면 다음 명령문을 사용할 수 있습니다:
SHOW INDEX FROM Players;
이 명령어를 통해 해당 테이블에 걸려있는 인덱스들의 정보를 확인할 수 있습니다.
또한, 쿼리가 실제로 어떤 인덱스를 사용하는지 확인하려면 EXPLAIN 명령어를 사용할 수 있습니다:
EXPLAIN SELECT * FROM Players WHERE jersey_number = 7;
이 명령어는 MySQL이 쿼리를 실행할 때 어떤 인덱스를 사용하는지에 대한 정보를 제공합니다.
인덱스는 성능을 향상시키지만, 남발하면 오히려 성능 저하를 초래할 수 있습니다. 인덱스는 추가적인 저장 공간을 차지하며, 데이터 삽입, 업데이트, 삭제 시마다 인덱스를 갱신해야 하기 때문에 오버헤드가 발생합니다. 따라서, 불필요한 인덱스를 만들지 않는 것이 중요합니다.
특히, 범위 조회나 OR 조건이 포함된 쿼리의 경우 적절한 인덱스 설계가 필요합니다. 또한, 해시 인덱스와 같은 다른 인덱스 종류도 존재하지만, 특정 조건에서만 유용하므로 사용 시 주의가 필요합니다.
이번 포스트에서는 데이터베이스 인덱스의 개념과 사용 방법, 그리고 인덱스를 효율적으로 활용하는 방법에 대해 살펴보았습니다. 인덱스는 데이터베이스 성능을 좌우하는 중요한 요소이므로, 올바르게 설계하고 사용하는 것이 중요합니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe