Index란?
- 자료 검색을 효율적으로 하기 위한 목차의 개념.
Clustered-Index / Non-Clustered Index
Clustered Index는 인덱스와 데이터가 함께(clustered) 있는 개념으로, Index를 타고 내려가서 Leaf노드에는 해당하는 값이 함께 존재한다. Non-Clustered Index는 최종 리프노드는 데이터가 저장되어 있는 저장소의 주소를 Pointer로 가리키고 있다.
Clustered Index는 primary key나 unique 값을 통해 보통 자동으로 생성되는데, index를 기준으로 정렬하여 이를 활용하기 때문에 검색 속도가 Non-Clustered-Index에 비해 빠르다. 또한 인덱스와 데이터가 함께 정렬되고, 이 정렬 할 기준을 정해야 하므로 하나의 인덱스만 생성할 수 있다. (= 이름으로 정렬하고, 주민번호로 정렬하고 할수 없으니 당연)
Non-Clustered Index는 Index만 정렬해 놓고, 최종 노드에서 참조값을 통해 데이터를 읽는것으로 볼 수 있다. 함께 정렬되지 않기 때문에 여러 인덱스를 만들 수 있다.
그럼 인덱스는 무조건 많이 만드는 것이 좋나?
그렇지 않다. 인덱스 자료구조 자체를 저장할 공간도 따로 필요하고, 해당 인덱스 구조를 유지하기 위해 값이 추가되거나, 수정, 삭제될 경우 인덱스 자료구조에도 업데이트 해주는 추가 작업이 필요하게 된다. 따라서 조회 작업을 할 때 유리하다. 따라서 조회 작업이 상대적으로 많거나, 데이터가 많고 조회 하는 값이 2~4%이하일때 생성하는 것이 좋다. 또한 인덱스를 여러개 생성할 경우, 옵티마이저가 잘못된 인덱스를 선택할 수 있기 때문에 3~4개가 적당하다.
인덱스를 사용할 컬럼은 어떻게 정하나?
카디널리티가 높고, 선택도가 좋고(=낮아서 좋은거), 중복도가 낮고, 활용도가 높은 것을 선택한다. 카디널리티는 중복된 열을 제외한 남은 열의 개수로 생각하면 편하고, 선택도는 해당 컬럼으로 조회했을 때 전체 행에 비해 남는 행의 비율을 생각하면 된다. 활용도는 Where나 join절에 많이 사용하는 것을 얘기한다.
인덱스를 생성해두면 반드시 해당 인덱스를 활용하게 되나?
그렇지 않다. 여러 규칙이 존재한다. 우선 복합 컬럼으로 인덱스를 설정해뒀을 경우 첫 컬럼의 조건을 활용해야 해당 인덱스를 타게 된다. 예를들면 A,B,C인덱스가 있을때 B=10, C=20의 조건으로 검색하는 경우 A를 사용하지 않아 활용되지 않는다.
또한 범위조건이 포함된 컬럼 다음 인덱스는 활용되지 않는다. 예를들면 , A=10, B>20, C=30 의 조건을 걸어 쿼리를 보내면 B까지는 포함되겠지만 C는 포함되지 않는다.
인덱스 값을 조작한 경우 활용되지 않는다. A+10 > 20 의 조건으로 찾는경우와 A > 10의 경우는 같아 보이지만 앞의 조건은 A+10으로 A값을 조작한 것이므로 활용되지 않는다.
null의 값은 is Null로 인덱스 레인지 스캔이 가능하다.
Reference : https://jojoldu.tistory.com/243