직전 포스트에서는 인덱스의 정의와 왜 쓰는지를 알아보았습니다.
이제 그런 인덱스를 거는 방법을 알아보겠습니다.
💡 primary key 즉 기본키는 인덱스를 자동으로 생성이 됩니다.
index작업은 하나의 컬럼에서할수있고
두개의 컬럼에서 할수가 있습니다.
위에서처럼 테이블이 존재한다고 합시다.
이렇게 된다면 nations에는 영화가 생산된 나라들의 정보들이 있는데
인덱스를 왜하는지의 이유를 말씀드렸듯이 인덱스를 걸지 않으면
WHERE nations='korea'
의 조건절이 있을때
100만개의 영화 데이터들이 있다면 100만개의 row를 모두 검색할것입니다.
하지만 인덱스를 건다면 그러한 불상사가 생기지 않겠죠??
CREATE INDEX index_nations ON movies(nations);
형식은 쿼리문처럼 CREATE INDEX [인덱스명] ON [테이블명]([컬럼명]);
진행이 됩니다.
💡 인덱스의 오름차순과 내림차순을 정하고 싶다면 컬럼명뒤에
CREATE INDEX [인덱스명] ON [테이블명]([컬럼명] ASC 또는 DESC);
하나의 컬럼만 index를 걸수도 있지만
위의 테이블에서 예시를 들면 OTT에서 방영하는 특정나라의 작품을 알아야하는 조건절이 있을수도 있습니다. 이러한 두개의 컬럼을 동시에 index작업 진행또한 가능합니다.
이렇게 두개의 컬럼을 동시에 index작업을 하는것을 복합인덱스라고 합니다.
CREATE INDEX index_ott_nations ON movies(nations,OTT);
💡 하지만 index가 좋다고 무자비하게 모든컬럼에 걸고 복합인덱스를 많이 한다면 단점 또한 있습니다.
공간 사용량 증가 : 인덱스를 생성하면 추가적인 디스크의 공간이 필요, 복합인덱스의 경우 더많은 컬럼의 정보를 담아야 하기때문에 공간 사용량이 많아 집니다.
쓰기 성능 저하 : 복합인덱스의 경우 데이터의 삽입,삭제,업데이트시에 인덱스 또한 업데이트 해야하는 이때 쓰기 성능이 저하될수도 있습니다.
최적화 불가능한 쿼리 : 복합인덱스는 컬럼의 순서에 맞게 정렬이 되는데, 특정 컬럼이 사용이 안되는 쿼리에서 복합인덱스가 최적화에 도움이 안됩니다.
그리고 복합인덱스를 생성할때 컬럼의 순서 즉 nations가 앞에 올것인지
OTT가 앞에 올것인지가 굉장히 중요합니다.
CREATE INDEX index_ott_nations ON movies(nations,OTT);
이렇게 생성된 인덱스를 b-tree관점에서 보게되면
왼쪽을 기준으로 nations가 정렬이 되고 그후에 nations의 값이 같으면 OTT의 값을 정렬을 하기 때문에 복합인덱스를 생성시 컬럼의 순서를 신경써야합니다.
지금까지는 만들어진 테이블에서 인덱스 작업을 하였지만
테이블을 만듦과 동시에 인덱스 생성이 가능합니다.
CREATE Table movies (
movie_id integer primary key,
title varchar(20) not null,
nations varchar(10),
media_type varchar(10),
OTT varchar(10),
);
위의 쿼리문처럼 테이블을 만든다고 했을때 인덱스를 추가 하려면 아래의 쿼리문들 테이블 생성쿼리에 추가해주면 됩니다.
INDEX index_nation (nations)
INDEX index_ott_nations (nations,OTT)
💡 테이블을 만들면서 인덱스를 생성할때는 인덱스명을 생략이 가능합니다.
이제 관계형데이터베이스의 색인을 해보았다면 NoSQL의 대표적인 MongoDB에서도 해보겠습니다.
키값은 위의 테이블사진과 같이 있다는 가정으로 진행하겠습니다.
db.movies.createIndex({ "OTT": 1 })
여기서 MySQL과 다른점을 1의 사용입니다.
1은 오름차순의 의미를가지고 반대인 내림차순은 -1 입니다.
하지만 어떠한 방향으로 가도 동일하게 접근하기 때문에 성능의 차이는 크지 않습니다.
db.movies.createIndex({ "OTT": 1, "nations":1 })
💡 지금까지의 포스팅을 통해서 인덱스의 정의와 인덱스를 어떻게 적용하는지를 알아보았습니다.
이제 인덱스 뒤에서 어떻게 돌아가고 어떠한 알고리즘을 통해서 이루어지는지 다음 포스팅에서 알아보겠습니다.