코드를 작성할 때 인덱스라고 하면,배열의 위치를 의미한다.
책에서 특정 단어를 찾으려고 하면 처음부터 끝까지 책을 넘기며 찾아야 하는데 이 방법은 너무나 비효율적이고 오래걸리기 때문에 책의 앞페이지에는 목차가 존재한다. 하지만, 목차는 알파벳 순서대로 되어 있는 것이 아니고 책에서 말하고자 하는 개념 순서로 되어 있기에 책의 뒷 부분에 색인 이라는 것이 존재하여 특정 개념이나 단어가 어느 페이지에 위치하는 지를 알려준다.
데이터베이스에도 이런 색인(INDEX) 작업을 할 수 있다.
SQL
SELECT page FROM db_book WHERE title = "transaction";
라고 하면 DB는 FULL SCAN을 하게 된다. (매우 비효율적!)
이 때 인덱스를 생성하면
create index PAGE_INDEX on db_book(page);
B-Tree 구조로 된 인덱스를 생성하면 O(1)의 시간 복잡도로 데이터를 찾을 수 있다.
즉, 인덱스는 특히 where절에서 사용할 column 에 대한 효율화인 것이다.
그런데 인덱스를 활용하면 무조건 좋은가? NO
인덱스는 메모리를 차지한다. 인덱스를 생성하기 위해서 데이터베이스에서 추가적으로 10% 정도 차지하므로 불필요한 메모리 낭비가 있을 수 있다. 따라서 조회시 자주 사용하고 고유한 값으로 인덱스를 만드는 것이 좋다.
한 테이블 당 3~5개가 적당하다.
카디널리티 : 컬럼에 사용되는 값의 중복된 정도, 중복 수치를 나타내는 지표
카디널리티가 높을수록 다양하다는 것이고 데이터의 중복도가 낮다. 따라서 카디널리티가 높을수록 좋다.
선택도 : 데이터에서 특정 값을 얼마나 잘 선택할 수 있는가에 대한 지표이다. 5~10%가 적당하다.
선택도의 계산 : (칼럼의 특정값의 row 수 / 테이블의 총 row 갯수) * 100
값이 낮을 수록 좋다 즉, 선택도가 낮을수록 좋다
활용도 : 해당 컬럼이 실제 작업에서 얼마나 많이 활용되고 있는지에 대한 값을 의미하며 활용도가 높을수록 좋다. (조회가 많이 되는 데이터를 인덱스로 가지면 좋다)
중복도 : 중복 인덱스 여부에 대한 값 인덱스도 결국 메모리의 일부이므로 중복된 값을 삭제하는 것이 좋다 즉, 중복도가 없을수록 인덱스에 좋은 칼럼