- 인덱스(Index)
- 데이터(레코드)를 빠르게 접근하기 위해 <키, 주소> 쌍으로 구성된 데이터
- Index가 없으면 테이블의 특정값을 찾기 위해 모든 데이터를 서치하는 TABLE SCAN 발생
- 테이블에 기본키(PK)가 있으면 기본키(PK)에 대한 기본 인덱스가 자동 생성된다.
- 인덱스의 종류
- M-one 검색 Tree
- B-Tree
- B*-Tree
- B+-Tree
- 인덱스를 잘 사용하면 성능이 향상될 수 있지만, 잘못 설정하면 역효과가 발생한다.
- ROWID
- 테이블에서 행의 위치를 지정하는 논리적인 주소값
- 기본적으로 INSERT 되는 순서대로 입력 되지만, 정렬 없이 저장된다.
- SELECT name, ROWID FROM test;
- INDEX는 WHERE 절에 오는 조건컬럼이나, JOIN 조건절에 오는 조건컬럼에 만들어 두는게 원칙이다.
- B-Tree 인덱스의 종류
- UNIQUE INDEX
- Non UNIQUE INDEX
- Function Based INDEX(함수 기반 인덱스)
- Descending INDEX
- Composite INDEX(결합 인덱스)
- UNIQUE INDEX
- KEY 값이 중복되는 데이터가 없다.
- 인덱스 성능이 매우 좋아지지만, 중복되는 값이 들어오는 경우 성능이 엄청 안좋아질 수 있다.
- UNIQUE INDEX가 지정되면 데이터 값이 중복으로 들어갈 수 없다.
- CREATE UNIQUE INDEX 인덱스명 ON 테이블명(컬럼명1 ASC | DESC, 컬럼명2 ...);
- Non UNIQUE INDEX
- 중복된 데이터가 들어와야 하는 경우 사용
- CREATE INDEX 인덱스명 ON 테이블명(컬럼명1 ASC | DESC, 컬럼명2 ...);
- Function Based INDEX(함수 기반 인덱스)
- WHERE 조건절에 컬럼을 가공한 INDEX를 생성할 수 있다.
- 조건이 변경되면 다시 만들어야 하고 FBI는 기존 인덱스를 활용할 수 없는 단점도 있다.
- CREATE INDEX 인덱스명 ON 테이블명(컬럼명1 + 100);
- Descending INDEX
- INDEX는 생성될 때 기본적으로 오름차순으로 생성되나, 내림차순 INDEX를 만들 때 사용한다.
- CREATE INDEX 인덱스명 ON 테이블명(컬럼명 DESC);
- Composite INDEX
- 두개 이상의 컬럼을 합쳐서 만드는 INDEX
- WHERE 조건절에 컬럼이 2개 이상의 AND로 연결된 경우
- CREATE INDEX 인덱스명 ON 테이블명(컬럼명1, 컬럼명2, ...);
- INDEX 사용시 주의 사항
- INDEX가 항상 SQL 성능을 빠르게 하는것은 아니다.
- SQL 성능이 느려졌다고 빨라질 때까지 INDEX를 만들면 매우 위험하다.
- INDEX의 취약점
- INSERT : INDEX Split 발생 가능
- INDEX 블럭 용량 초과, 이 과정은 시간이 오래 걸린다.
- DELETE
- DELETE를 해도 데이터는 지워지지만 INDEX는 지워지지 않는다.
- UPDATE
- 데이터를 UPDATE해도 INDEX는 UPDATE 되지 않는다.
- UPDATE 시 기존의 INDEX가 삭제되고 새로운 데이터의 INDEX가 생성된다. 즉, UPDATE 작업은 두가지 작업이 동시 발생하며 부하를 더 준다.