주제내용인덱스 색인 - 위키백과 만약에 인덱스가 없다면 ?cluster index non-cluster index WHERE 고려할 점인덱스 효율적으로 설정하기카디널리티 : 높아야한다. (상대적으로)선택도 : 낮아야한다.활용도사용하기주의 !인덱스 컬럼 좌측을 수정한 WHERE 문NULL 멀티 컬럼 인덱스인덱스 키 값의 크기
주제
index에 대해서 알아봅시다
내용
인덱스
색인 - 위키백과
책 속의 낱말이나 구절, 또 이에 관련한 지시자를 찾아보기 쉽도록 일정한 순서로 나열한 목록을 가리킨다. 인덱스 라고도 한다.
- 인덱스는 데이터를 빠르게 조회할 수 있도록 도와주는 자료구조 입니다.
- 데이터는 내부적으로 힙영역(Heap)영역에 저장이 됩니다. ⇒ 저장 공간이 필요하다.
만약에 인덱스가 없다면 ?
- 테이블 전체를 풀 테이블 스캔하기 때문에 비효율적
- 풀 테이블 스캔 ?
- 데이터가 1억건이 있다면 1억번의 값을 비교
cluster index
Cluster : 무리, 무리를 이루다
- 인덱스 생성 시 데이터 페이지 전체를 다시 정렬
- 해당 인덱스를 기준으로 정렬이 필요하다.
- 테이블 구조에 영향을 미친다.
- 성능이 매우 빠르다.
- PK , 테이블 당 1개
- 클러스터 인덱스를 잡는 우선순위
- pk → 클러스터 인덱스
- unique index로 정의된 컬럼 중 하나
- 보이지 않는 컬럼을 내부적으로 추가하여 사용한다. ⇒ 인조 식별자
- 테코톡 - 찰리의 인덱싱 : https://www.youtube.com/watch?v=P5SZaTQnVCA

non-cluster index
- 인덱스 키 값에는 해당 데이터에 대한 포인터가 존재
- 정렬과는 상관이 없음, 주소 값으로 찾아갈거니까
- 인덱스의 구조는 데이터 행과 독립적
- 한 테이블에 여러 개 생성 가능
- 리프 페이지가 데이터 페이지를 갖고 있음
- 테코톡 - 찰리의 인덱싱 : https://www.youtube.com/watch?v=P5SZaTQnVCA

WHERE
- 인덱스는 WHERE 절에서 효과가 있다
- WHERE 절을 사용하지 않고 인덱스가 걸린 컬럼을 조회하는 것은 성능에 향상에 영향이 없다.
고려할 점
- 조회속도는 빨라지지만 UPDATE, INSERT, DELETE 의 속도는 저하된다는 단점이 있다.
- INSERT의 경우, Table의 index 색인 정보를 갱신하는 추가적인 비용 소요
- DELETE의 경우, 실제 데이터를 삭제하는 것이 아닌 Index 내부에서 사용하지 않는다고 설정을 해주기 때문에 공간이 낭비
- UPDATE의 경우, 인덱스에는 UPDATE라는 개념이 없어서 인덱스에서는 DELETE를 하고 INSERT를 해줌
- 조건절(WHERE)에서 많이 사용되는 컬럼을 인덱스로 생성하는 것이 좋다.
- 동일한 데이터가 적은 컬럼혹은 JOIN을 할 때 사용되는 컬럼을 인덱스로 선언하자
인덱스 효율적으로 설정하기
카디널리티 : 높아야한다. (상대적으로)
- 카디널리티 = 총 레코드 수 X 선택도
- 특정 데이터 집합의 유니크(Unique)한 값의 개수이다.
- 중복이 적으면 카디널리티가 높고, 중복이 많으면 카디널리티가 낮다.
선택도 : 낮아야한다.
- 전체 레코드 중에서 조건절에 의해 선택될 것으로 예상되는 레코드의 비율
- 선택도 = 카디널리티 / 총 레코드 수
- 선택도는 0~1사이의 값이며, 1일 때 모든 값이 유니크하다.
- 선택도가 높은 컬럼에 인덱스를 걸면 인덱스가 특정 레코드를 잘 골라내어 인덱스 효율이 높아진다.
활용도
- 해당 컬럼이 실제 작업에서 얼마나 활용되는지
사용하기
주의 !
인덱스가 컬럼에 지정되어 있고, select가 있고, where을 사용하지만 인덱스 사용이 안되는 경우
인덱스 컬럼 좌측을 수정한 WHERE 문
NULL
멀티 컬럼 인덱스
- 인덱스를 걸어주는 순서가 중요하다.
- 첫 번째 컬럼에 뒤가 의존된다.
- 즉, where에 첫 번째 컬럼이 있을 때 인덱스를 타게 된다.
인덱스 키 값의 크기
- InnoDB는 디스크에 데이터를 저장하는 가장 기본 단위를 페이지라고 하며, 인덱스도 페이지 단위로 관리된다.
- 페이지는 16KB로 크기가 고정
- 만약 자식 노드의 주소가 담긴 크기가 12Byte 정도라면 16 * 1024 / (16 + 12) = 585 로 인해 하나의 페이지에는 585개가 저장될 수 있다.