SQLite | 인덱스(Index) | 인덱스 의미와 장단점
테이블에 많은 열이 포함되어 있거나 대량의 데이터가 저장되어 있는 경우, 테이블에서 특정 데이터를 검색하려고 하면 매우 시간이 걸릴 수 있다. 이런 경우에 적절한 컬럼에 인덱스를 생성하면 검색이 빨라질 수 있다. 여기에서는 인덱스에 대한 간단한 설명과 인덱스를 사용하는 경우의 장점과 단점에 대해 설명한다.
인덱스란?
인덱스는 테이블의 정보를 검색했을 때 검색의 대상으로 자주 사용하는 컬럼의 값만 꺼내 쉽게 찾을 수 있도록 해 놓은 것이다. 예를 들어 다음과 같은 4개의 컬럼이 있는 테이블이 있다.
id | name | address | old |
---|---|---|---|
1 | devkuma | Seoul | 23 |
2 | kimkc | Busan | 19 |
3 | araikuma | Seoul | 38 |
4 | mykuma | Daejeon | 18 |
5 | yourkuma | Seoul | 17 |
6 | happykuma | Seoul | 24 |
name 컬럼의 값을 검색하려고 할 때, 테이블에 저장되는 데이터는 차례로 나열되어 있는 것이 아니므로 원하는 데이터가 있는지 차례로 검색해 나갈 것이다. 데이터가 이 정도의 양이면 문제가 없겠지만, 수백만의 데이터가 저장되어 있는 경우에 위에서 부터 찾아가는 것은 매우 비효율적이다.
이러한 경우 인덱스를 생성하면 검색 속도를 향상시킬 수 있다. 인덱스를 간단히 대상 컬럼의 데이터를 검색하여, 빠르게 검색할 수 있도록 가공하여 저장해 둔 것이다. 예를 들어 name 컬럼의 값을 대상으로 한 인덱스를 만들면 다음과 같은 것이다.
id | name |
---|---|
3 | araikuma |
1 | devkuma |
2 | kimkc |
6 | happykuma |
4 | mykuma |
5 | yourkuma |
이 인덱스는 id 컬럼와 name 컬럼의 값만을 유지하고 name 컬럼의 값을 오름차순으로 정렬하여 데이터를 저장하고 있다. name 컬럼의 값을 검색할 때 원본의 테이블을 검색하는 것보다 데이터 량이 적고 또한 정렬도 이루어지고 있기 때문에 빠르게 검색할 수 있다.
그럼 어떻게 빠르게 검색 할 수 있는지에 대해서는 B-Tree 방식이나 함수 방식 등 다양한 방법이 있을 것이다. SQLite에서는 어떤 방식을 하고 있는지는 알 수 없다.
인덱스를 생성하면 테이블과는 별도로 검색에 최적화 된 상태로 필요한 데이터만 테이블과는 별도로 저장된다는 것을 기억하도록 하자.
인덱스의 장점과 단점
인덱스를 생성 해두면 유용하기도 하지만, 무조건 장점만 있는 것이 아니다. 테이블과는 별도로 데이터를 독자적으로 보유하고 있기 때문에 테이블에 데이터를 추가하면 인덱스으로도 데이터가 추가된다. 또한 데이터를 추가할 때마다 정렬도 다시 이루어진다. 결과적으로 데이터를 추가 할 때 처리 속도가 느려진다.
저장되어 있는 데이터가 적은 테이블에서 인덱스를 만들거나 저장되는 데이터의 종류가 적은 컬럼에 인덱스를 생성해도 효과는 그다지 기대할 수 없다. 데이터의 검색이 그다지 많지 않는 컬럼에 인덱스를 생성하는 것은 의미가 없다.
인덱스는 유용하지만 데이터 추가시 처리가 무거워지는 단점도 있으므로 인덱스가 필요한지에 대해 잘 검토한 후에 생성되도록 해야 한다.