본문 바로가기

면접 질문지 소스

데이터베이스의 인덱스란?

728x90

인덱스란?

만약 유저에 대한 정보를 찾고 싶을 때 sql문으로 찾으면 됩니다.

select * from user where id = "abc"

 

하지만 이렇게 되면 하나하나 맞는지 비교하며 찾기 때문에, 데이터가 많으면 정보를 불러오는데 오랜 시간이 걸립니다. 행을 반씩 나눠가며 찾으면 빠르게 찾을 수 있습니다. 비교하고 싶은 열의 값을 정렬해둔 컬럼을 인덱스라고 합니다.

 

인덱스를 쓰면 좋을 때

대규모 테이블에서 특정 조건을 자주 검색하는 경우 인덱스를 사용하면 좋습니다. 예를 들어 고객 테이블에서 고객 ID를 기반으로 자주 조회할 경우 인덱스를 사용하면 효율적입니다. 

SELECT * FROM customers WHERE customer_id = 12345;

 

여러 테이블을 조인하거나 특정 조건을 데이터를 자주 검색하고, 데이터를 정렬하거나 그룹화할 때 인덱스가 있으면 처리 속도가 빨라집니다.

SELECT * FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.customer_name = 'John Doe'
ORDER BY order_date DESC;

 

컬럼 내의 값이 중복되지 않거나, 중복이 적은 경우 인덱스가 효과적입니다. 예를 들어 주민등록번호나 이메일 주소처럼 중복이 거의 없는 열에 인덱스를 사용하는 것이 유리합니다.

 

SELECT * FROM users WHERE email = 'example@example.com'

 

 

인덱스를 쓰면 안좋을 때

테이블 크기가 작으면 인덱스를 사용해도 성능 향상이 거의 없습니다. 테이블이 작을 경우 데이터베이스는 테이블 전체를 빠르게 검색할 수 있기 때문에, 인덱스 생성과 유지의 오버헤드가 더 커질 수 있습니다.

 

인덱스를 가진 테이블은 데이터를 삽입하거나 업데이트, 삭제할 때마다 인덱스도 함께 갱신해야 하기 때문에 성능 저하가 발생합니다. 자주 변경되는 테이블에서는 인덱스 사용이 오히려 비효율적일 수 있습니다. 예를 들어 로그 테이블에 지속적으로 새로운 로그를 삽입하는 경우, 삽입할 때마다 인덱스가 갱신되어 성능이 저하될 수 있습니다.

 

값의 종류가 적어서 중복이 많은 경우, 인덱스 효율이 떨어집니다. 예를 들어 성별을 나타내는 male,female은 중복이 많기 때문에 인덱스를 사용해도 성능 이점이 거의 없습니다.

select * from gender = "male"

 

인덱스는 검색된 결과가 적을 때 더 유용합니다. 반면, 결과가 많은 쿼리에서는 인덱스가 성능 향상에 큰 도움이 되지 않을 수 있습니다. 왜냐하면 인덱스를 이용해 찾은 후에도 대량의 데이터를 읽어와야 하기 때문입니다.

select * from user where sal > 10000

 

 

클러스터링 인덱스

테이블의 데이터 자체를 정렬해서 저장하는 방식입니다. 즉 테이블의 행들이 인덱스에 따라 물리적으로 정렬됩니다.

테이블당 하나만 가질 수 있고 기본 키에 주로 사용됩니다.

select * from customers where customer_id = 1001

 

비클러스터링 인덱스

테이블의 데이터와 별도로 인덱스를 생성하여 데이터 검색 속도를 향상시키는 방식입니다.

한 테이블에 여러 개의 비클러스터링 인덱스를 생성할 수 있고, 비클러스터링 인덱스는 인덱스를 통해 찾은 후, 그 인덱스가 가르키는 실제 데이터에 접근합니다.

select * from customers where customer_name = "John Doe"

 

클러스터링 인덱스는 전화번호부처럼 순서대로 정렬되어 있어서 특정 데이터를 바로 찾을 수 있습니다.

비클러스터링 인덱스는 도서관의 색인 카드처럼 특정 데이터의 위치를 알아내어 데이터를 찾아 갈 수 있습니다.

 

++

인덱스란?

인덱스 자료구조는

비플러스와 해시의 차이는

클러스터링 & 비클러스터링의 차이