MySQL Indexing

Hansu Kim·2022년 10월 31일
0

Database

목록 보기
6/6

인덱스는 데이터가 있는 위치이다.
MySQL InnoDB에서는 인덱스가 없는 테이블 탐색시 Full scan이 발생하게 된다.
하지만 인덱스 생성시 B-Tree를 통해 데이터를 탐색하기 때문에 data page read 횟수가 줄어들게 된다.

인덱스에는 두 가지 종류가 있다.

  • Clustered Index
  • Non Clustered Index

Clustered Index

  • 테이블당 1개만 존재
    • Primary Key 제약 조건으로 생성하면 자동으로 생성
  • 인덱스에 데이터 페이지가 함께 존재
  • B-Tree의 Leaf page == data page
  • 데이터가 항상 정렬된 상태여야 한다.
    • INSERT, UPDATE, DELETE 문 등이 발생하면 페이지 재분할을 통해 기존 정렬을 재정렬해야한다.

Non-Clustered Index

  • Secondary Index라고도 부른다.
  • 테이블당 여러개가 존재할 수 있다.
    • Unique 제약 조건으로 생성하면 자동으로 생성
  • 인덱스와 데이터페이지가 따로 존재
  • 리프 페이지에서 데이터가 있는 곳의 주소를 가짐
  • 데이터 페이지에 데이터가 정렬되지 않아도 됨
  • Clusterd Index보다 속도가 약간 느리지만 INSERT, UPDATE, DELETE시 부하가 적다.

Cardinality

어떤 컬럼에 인덱스를 생성해야 하는가?
-> 중복 수치가 낮은 것

인덱스 사용시 주의 사항

  • 사용하지 않는 인덱스는 삭제하여 페이지가 재정렬되는 오버헤드를 줄여야 한다.
  • 외래키를 지정한 열에는 자동으로 외래 키 인덱스가 생성
  • Where 절에서 자주 사용되는 컬럼만이 인덱스의 가치가 있다.

0개의 댓글