인덱스의 개념을 설명할 때 가장 쉬운 것은 책의 예를 드는 것이다.
예를 들어, 자바 프로그래밍 이론에 관련된 책을 보고 있다고 가정하자.
책에서 "객체지향언어" 라는 단어를 찾으려고 한다면 어떻게 할 것인가?
물론 첫페이지 부터 끝페이지까지 다 읽어 나가면서 찾을 수 있지만,
책의 제일 뒤에 있는 <찾아보기>를 이용하면 더 빠르게 찾을 수 있을 것이다.
<찾아보기> 페이지는 가,나,다 순서로 정렬되어 있어서 "객체지향 언어"라는 단어를 쉽게 찾을 수 있다.
인덱스를 만들지 않아도 테이블의 컬럼의 수 자체가 작은 경우에는 성능에는 별 문제가 되지 않았다.
책으로 치면 2~3 페이지 분량의 책이어서 <찾아보기>가 없어도 별 불편이 없는 것과 마찬가지다.
하지만, 수천페이지의 책의 경우는 <찾아보기>가 없다면
책에서 특정 키워드 하나를 찾는데 몇 시간씩 걸릴 수가 있다.
그런데, 만약 <찾아보기> 가 있다면 몇십 초 또는 몇 초 만에 원하는 것을 찾을 수 있을 것이다.
실제 테이블에서도 이 정도의 성능 차이가 날 수 있다.
특히, 대용량의 테이블일 경우에는 더욱 그렇다.
이것이 인덱스를 사용하는 이유이다.
즉, 인덱스는 '데이터를 좀 더 빠르게 찾을 수 있도록 해주는 도구'인 것이다.
그렇다고 항상 인덱스가 좋다고만 할 수는 없다.
위에서는 어떠한 단어가 포함된 문장을 찾을 때 <찾아보기>를 찾아보는 것이 좋은 것처럼 이야기했다.
하지만, 다른 경우를 생각해보자.
만약 우리가 "데이터베이스 이론" 이라는 책을 보고 있고
해당 책에서 "데이터베이스" 라는 단어를 책에서 찾으려 한다고 가정하자.
책의 거의 모든 페이지에서 "데이터 베이스"라는 단어가 나올 것이므로
< 찾아보기>에 존재하는 "데이터베이스"라는 단어가 본문 내용만큼 되거나 오히려 본문보다 더 많아질 수 있다.
그리고 <찾아보기> 를 통하여 "데이터 베이스"를 찾아보려고 하니
<찾아보기> 한번 실제 페이지 한번, <찾아보기> 한번 실제 페이지 한번,
... 계속해서 <찾아보기> 페이지와 실제 페이지를 왔다 갔다 할 것이다.
차라리 처음부터 책을 넘기면서 "데이터베이스"를 찾는 행동이 더욱 효율적일 것이다.
실제 데이터베이스에서도 이와 비슷한 일이 일어난다.
필요 없는 인덱스를 만드는 바람에 데이터베이스가 차지하는 공간만 더 늘어나게 되고,
인덱스를 이용해서 데이터를 찾는 것이 전체 테이블을 찾아보는 것보다 훨씬 느려지게 된다.
인덱스는 튜닝(tuning)에 즉각적인 효과를 내는 가장 빠른 방법 중 한 가지다.
즉, 인덱스를 생성하고 인덱스를 사용하는 SQL 을 만들어 사용한다면,
기존보다 아주 빠른 응답속도를 얻을 수 있다.
또한, 서버 입장에서는 적은 처리량으로 요청한 결과를 얻게 되므로,
다른 요청에 대해서도 많은 일을 할 수 있게 된다.
결과적으로 전체 시스템의 성능이 향상되는 효과도 얻는다.
참고로, 인덱스와 테이블은 거의 동시에 접근하게 되므로
인덱스와 테이블을 별도의 디스크에 분리해서 만드는 것도
디스크 경합을 줄여서 더욱 빠른 결과를 얼을 수 있다.
인덱스의 장점
1) 검색 속도가 빨라질 수 있다.
2) 인덱스로 인해서 쿼리의 부하가 줄어, 시스템 전체의 성능이 향상된다.
인덱스의 단점
1) 인덱스가 데이터베이스 공간을 차지해서 데이터베이스 크기의 10% 정도의 추가 공간이 필요하다.
2) 처음 인덱스를 생성하는 데 시간이 많이 소요될 수 있다.
'SQL Tuning' 카테고리의 다른 글
인덱스 탐색 효율(SQL server) (0) | 2022.03.23 |
---|---|
북마크 룩업 최소화 기법(3) - Covered Index (0) | 2022.01.29 |
북마크 룩업 최소화 기법(2) - Clustered Index (0) | 2022.01.28 |
북마크 룩업 최소화 기법(1) - 결합 인덱스 (0) | 2022.01.24 |
[MSSQL] 인덱스 구조 (0) | 2021.12.20 |