인덱스(Index)
인덱스는 데이터베이스가 많은 데이터가 존재할 때 빠르게 특정 데이터를 접근할 수 있게 해주는 안내자의 역할을 하는 데이터베이스 객체이다. 데이터베이스가 구축된 시점부터 데이터는 지속적으로 늘어나게 되므로 인덱스는 시간이 지날수록 매우 중요한 요소가 된다.
간단하게 생각하면 알파벳 순서의 키워드와 페이지 번호를 기록하고 있어서 특정 키워드를 가지고 해당하는 챕터의 내용을 쉽게 찾을 수 있게 하는 책의 색인과 비슷하다고 생각할 수 있다.
SQL문을 이용한 인덱스의 정의 및 관리
SQL의 CREATE TABLE문에서 PRIMARY KEY나 FOREIGN KEY 또는 UNIQUE로 명시한 컬럼에 대해서는 큐브리드가 자동으로 인덱스를 생성한다. 추가적으로 인덱스를 정의하려면 CREATE INDEX문을 이용한다. 인덱스를 생성하는 구문은 다음과 같다.
CREATE [ REVERSE ] [ UNIQUE ] INDEX [ 인덱스 명 ]
ON 테이블 명 ( 컬럼 명 [(prefix_len)][ASC | DESC] [ {, 컬럼 명 [(prefix_len)][ ASC | DESC ]} ...] ) [ ; ]
|
|
|
a. |
REVERSE : 역순으로 인덱스를 생성한다. 역순 인덱스는 내림차순 정렬 연산 속도를 향상시킨다. |
|
|
b. |
UNIQUE : 유일한 값을 갖는 고유 인덱스를 생성한다. |
|
|
c. |
인덱스 명: 생성하려는 인덱스의 이름을 명시한다. 인덱스 이름은 테이블 안에서 고유한 값이어야 한다. |
|
|
d. |
prefix_length : 문자 또는 비트 스트링 타입의 컬럼에 인덱스를 설정하는 경우, 컬럼 값의 앞 부분 일부를 prefix로 지정하여 인덱스를 생성하기 위하여 컬럼 이름 뒤 괄호 안에 바이트 단위로 prefix 길이를 지정할 수 있다. 단, prefix_length는 다중 컬럼 인덱스 및 UNIQUE 인덱스에는 지정할 수 없다. |
|
|
e. |
테이블 명 : 인덱스를 생성할 테이블의 이름을 명시한다. |
|
|
f. |
속성 명 : 인덱스를 적용할 컬럼의 이름을 명시한다. 복합 인덱스를 생성할 경우 둘 이상의 컬럼 이름을 명시한다. |
|
|
g. |
ASC | DESC : 컬럼의 정렬 방향을 설정한다. REVERSE 인덱스인 경우 ASC는 무시되고 DESC로 처리된다. |
예제 1 |
단일 속성 인덱스 생성 SQL문
CREATE INDEX ON game(medal);
CREATE INDEX game_date_idx ON game(game_date);
|
결과 화면
역순 인덱스 생성 SQL문
CREATE REVERSE INDEX gold_index ON participant(gold);
|
결과 화면
다중 속성 인덱스 생성 SQL문
CREATE INDEX name_nation_idx ON athlete(name, nation_code);
|
결과 화면
| |
인덱스 삭제
DROP [ REVERSE] [ UNIQUE ] INDEX 인덱스 명
[ON 테이블 명 ( 속성 명 [ {, 속성 명 } ...) ] [ ; ]#
DROP [ REVERSE ] [ UNIQUE ] INDEX
ON 테이블 명 ( 속성 명 [ {, 속성 명 } ...) [ ; ]
|
|
|
a. |
REVERSE : 삭제하려는 인덱스가 역순 인덱스임을 지정한다. UNIQUE : 유일한 값을 갖는 고유 인덱스를 생성한다. |
|
|
b. |
UNIQUE : 삭제하려는 인덱스가 고유 인덱스임을 지정한다. |
|
|
c. |
인덱스 명 : 삭제할 인덱스의 이름을 지정한다. |
|
|
d. |
테이블 명 : 삭제할 인덱스가 지정된 테이블 이름을 지정한다. |
|
|
e. |
칼럼 명 : 삭제할 인덱스가 지정된 컬럼의 이름을 지정한다. |
-- 컬럼 명을 통한 단일 인덱스 삭제
DROP INDEX ON game(medal);
-- 인덱스 명을 통한 인덱스 삭제
DROP INDEX game_date_idx;
-- 역순 인덱스 삭제
DROP REVERSE INDEX gold_index ON participant(gold);
-- 다중 속성 인덱스 삭제
DROP INDEX name_nation_idx ON athlete(name, nation_code);
|
인덱스 변경
ALTER [ REVERSE ] [ UNIQUE ] INDEX 인덱스 명
[ON { ONLY } 테이블 명 ( 컬럼 명 [ {, 컬럼 명 } ...) ] REBUILD [ ; ]#
ALTER [ REVERSE ] [ UNIQUE ] INDEX
ON { ONLY } 테이블 명 ( 컬럼 명 [ {, 컬럼 명 } ...) REBUILD [ ; ]
|
|
|
a. |
REVERSE : 역순으로 인덱스를 생성한다. 역순 인덱스는 내림차순 정렬 연산 속도를 향상시킨다. |
|
|
b. |
UNIQUE : 유일한 값을 갖는 고유 인덱스를 생섷안다. |
|
|
c. |
인덱스 명 : 변경하려는 인덱스의 이름을 명시한다. 인덱스 이름은 테이블 안에서 고유한 값이어야 한다. |
|
|
d. |
테이블 명 : 인덱스를 생성할 테이블의 이름을 명시한다. |
|
|
e. |
칼럼 명 : 인덱스를 적용할 컬럼의 이름을 명시한다. 복합 인덱스를 생성할 경우 둘 이상의 컬럼 이름을 명시한다. |
-- 특정 컬럼 명을 통한 인덱스 변경
ALTER INDEX i_game medal ON game(medal) REBUILD;
-- 인덱스 명을 통한 인덱스 변경
ALTER INDEX game_date_idx REBUILD;
|
인덱스 사용시 고려 사항
|
|
a. |
SQL문이나 DML문의 성능 향상을 고려하여 인덱스 생성 여부를 결정해야 한다. 대용량 테이블이거나 WHERE절에서 빈번하게 사용되는 컬럼, 조인에 사용되는 컬럼인 경우 인덱스를 운용하는 것이 좋다. |
|
|
b. |
인덱스를 사용하게 되면 인덱스 스캔과 테이블 스캔을 하게 되어 최소 2회의 IO가 발생하게 되므로 레코드 개수가 적은 테이블의 경우 별도의 인덱스 없이 FULL SCAN 하는 것이 유리할 수 있다. |
|
|
c. |
인덱스는 질의문의 성능을 향상시켜 주지만 인덱스 데이터에 대한 쓰기 작업으로 DML 작업에 악영향을 주기 때문에 Update가 자주 일어나는 테이블에는 인덱스를 최소화 해야 한다.
| |