인덱스(Index)란?
인덱스란 저장 공간을 조금 더 활용해서 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다. 전공책의 뒷 편을 보면 인덱스(색인) 페이지가 있습니다. 특정 키워드와 관련된 페이지가 책의 어느 부분에 위치하는지 알려주고 있습니다. 책도 색인 페이지가 따로 존대하듯이 데이터베이스의 인덱스도 데이터베이스 메모리에 일정 공간을 사용해 저장을 하게 됩니다.
인덱스를 활용하면 데이터를 조회연산하는 작업들의 성능이 좋아질 수 있습니다. 기존의 방식은 Full Scan 방식으로 데이터베이스의 모든 내용을 조회하므로 오래 걸리지만 인덱스는 그것을 개선한 방식이기 때문이죠.
인덱스 구조
대부분의 DBMS는 B-Tree 계열 인덱스를 사용합니다. 그중에서도 B+-Tree를 사용하는 DBMS가 많다고 합니다. 얘도 B-Tree 계열이지만 데이터 포인터를 리프 노드에만 저장한다는 특징이 있습니다. 다른 노드들은 리프 노드를 빠르게 찾기 위한 인덱스 역할을 한다고 합니다.
B-Tree는 정렬된 데이터를 사용합니다. B+-Tree의 리프 노드도 정렬된 값을 사용하므로 범위 검색을 하기에 용이합니다.
인덱스를 사용하면 좋은 경우
1. 규모가 작지 않은 테이블 = 크키가 큰 테이블
2. INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼(인덱스 추가 작업이 필요하기 때문)
3. 데이터의 중복도가 낮은 컬럼(카디널리티가 높을 수록 인덱스 설정에 좋은 컬럼)
= 유니크한 값 위주
위의 조건을 만족하는 경우 특정 컬럼에 인덱스를 설정해두고 SELECT FROM "WHERE" 절에 사용해주세요. 그래야 인덱스의 장점을 이용해 성능 향상을 얻을 수 있습니다.
추가로 PK인 경우에는 자동으로 인덱스가 작성된다고 합니다.
Spring boot + JPA에서 사용하려면?
@Table(indexes = @Index(name="keyword", columnList = "author, title, content"))
프로젝트의 Entity에 위의 형태의 구문을 추가해주시면 됩니다. 저는 (author,title,content)를 키워드로 묶었지만 단일 컬럼만 사용하셔도 됩니다.
저는 여기까지 알아본 뒤에 제 프로젝트에 과연 적용해보는게 맞는지 의문이 들었습니다. 물론 연습용이라서 이것저것 해보면 좋지만.. WHERE 절을 사용하는 조회를 많이 안쓴다고 생각했거든요. 나중에 기능들이 많아진다면 그때는 필요성이 커질테니까 미리 기초체력을 다져본다고 생각하고 공부해봤습니다.
저는 간단한 내용 위주로 다뤘는데 깊은 내용을 원하시는 분들을 위해서 참고 링크를 달아두겠습니다.
출처 및 참고
https://mangkyu.tistory.com/96
https://yurimkoo.github.io/db/2020/03/14/db-index.html
https://d2.naver.com/helloworld/1155
쿼리 튜닝을 하는 내용까지 다루고 있습니다
https://www.burndogfather.com/m/238
MySQL 성능 최적화와 관련된 팁들을 정리해주셨습니다. 특히 OR절은 인덱스를 쓰나마나 Full Scan이 적용된다고 하니 Union 방식을 추천해주고 계십니다. 그러네 JPA/Hibernate 에서는 Union이 없는데 이건 또 어떻게 해야할지 고민해봐야겠네요.
'TechTalk' 카테고리의 다른 글
[Android] secret 관리를 위해 local.properties 활용하기 (0) | 2022.03.30 |
---|---|
키움증권 영웅문4에서는 조건식 정보를 어떻게 관리할까? (0) | 2022.03.19 |
웹 메일도 SMTP/POP를 쓸까? (0) | 2021.06.01 |
HTTP에 대하여 (0) | 2021.05.26 |
Kafka vs RabbitMQ (3) | 2021.05.25 |