티스토리 뷰

DB

[DataBase] Index 적용기

haunbl 2024. 8. 12. 15:53

들어가며

프로젝트에 들어가며 ID 이외의 속성으로 DB를 조회하는 방법을 선택했다. 
기본키 이외의 방법으로 DB의 조회를 할 때 "데이터 조회를 빠르게 하기 위해" 인덱스를 적용하였다.

 

 

인덱스란?(INDEX)

이번 프로젝트에 사용한 DB는 MySQL 8.0 버전을 사용하였다.

인덱스는 PK(기본키)가 아닌 특정 속성 또는 속성들로 INDEX를 통해 미리 정렬되어, 데이터를 빠르게 조회하기 위해 사용한다.

요는 "빠르게 데이터를 조회하기 위해"가 주목적이다.

 

 B-tree vs Hash Table

MySql에는 기본적으로 B-tree를 사용한다. B-tree 의 시간 복잡도는 O(log n)이며, 하나의 노드 안에 다량의 데이터를 갖고 있다는 특징을 갖는다. 다량의 데이터를 갖고 있기 때문에 DB의 호출이 줄어 DB의 조회하는 자료구조에 유리하다.

또한 검색 범위를 설정하고 조회가 가능하다.

하지만 Hash 를 사용한 인덱스는 오로지 equale(=) 동일한지만 확인이 가능한다. O(1)이라는 검색 속도를 갖지만 활용면에서는 제안이 많다.(범위 조회, 정렬 등 동일한지 확인 이외는 지원하지 않는다.)

 

 

인덱스 사용법

## CREATE INDEX {인덱스 이름} ON {테이블 이름(속성 이름)}

CREATE INDEX idx__member_id ON short_url (member_id);

위는 프로젝트에 적용 했던 인덱스를 적용하는 예시이다.

인덱스 이름을 지정하고 적용할 테이블 이름(속성 이름)을 위의 코드로 입력하면 인덱스를 적용할 수 있다.

 

 

EXPLAIN

EXPLAN을 SELECT 쿼리에 같이 요청하면 인덱스가 잘 작동하는지 확인할 수 있다.

EXPLAIN SELECT * FROM system_action_log where member_id=200000;

 

여기서 "Possible_keys" 에 값이 들어가 있다면 인덱스가 적용되었다는것을 확인할 수 있다.

 

 

인덱스 성능 비교

인덱스 적용
인덱스 미적용

 

결과에서 처럼 Index를 적용한 조회와 그냥 조회 결과 523ms, 730ms로 같은 조회도 인덱스를 적용하여 조회 회적화가 이루어지는 것을 알 수 있다.

 

 

인덱스는 어떤 상황에서 사용할까?

인덱스를 적절하지 않은 곳에 그냥 적용하게 된다면 DB 성능을 떯어뜨리게 될 것다.

이유는 INDEX를 사용하게 되면 DB에서 정령이 이루어지고 그 값을 저장하게 되는데 필요하지 않은 인덱스 정렬 값도 데이터 저장 공간을 차지할 수 있으며, 인덱스가 걸린 테이블에 추가, 수정, 삭제가 일어났을 때 재연산이 발생하여 DB성능에 지장을 주게 된다.

그렇기 때문에 적용에 있어서 신중하게 고민하여야 한다.

인덱스를 적용하는 경우

  • 대량의 데이터를 검색하는 경우
  • 정렬된 결과를 출력하는 경우
  • 조인 연산을 수행하는 경우
  • 유니크한 값을 가져오는 경우
  • 검색 빈도가 높은 경우

 

마치며

프로젝트에 인덱스를 적용하며 필요한 내용들을 정리해보았다.

이번 프로젝트에서 가장 많이 고민했던 것은 조회 성능 개선을 위한 방법에 대해 고민하는 좋은 시간이었던 것 같다.

이번 프로젝트에서는 캐시를 이용한 방법이나 SQL 튜닝을 통한 성능 개선을 통해 문제를 해결해 보았다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함