인덱스 작성과 삭제

유석현(SeokHyun Yu)·2022년 8월 16일
0

SQL

목록 보기
29/45
post-thumbnail

서론

인덱스데이터베이스 객체의 하나로 DDL을 사용해서 작성하거나 삭제한다.

표준 SQL에 CREATE INDEX라는 명령은 없다.

인덱스 자체가 데이터베이스 제품에 의존하는 선택적인 항목으로 취급되기 때문이다.

하지만 대표적인 데이터베이스 제품에는 모두 인덱스 구조가 도입되어 있으며, 모두 비슷한 관리 방법으로 인덱스를 다룰 수 있다.


1. 인덱스 작성

인덱스는 CREATE INDEX 명령으로 생성한다.

인덱스에 이름을 붙여 관리하는데, 데이터베이스 객체가 될지 테이블의 열처럼 취급될지는 데이터베이스 제품에 따라 다르다.

Oracle이나 DB2 등에서 인덱스는 스키마 객체가 된다.

따라서 스키마 내에 이름이 중복하지 않도록 지정해 관리한다.

한편 SQL Server나 MySQL에서 인덱스는 테이블 내의 객체가 된다.

따라서 테이블 내에 이름이 중복되지 않도록 지정해 관리한다.

인덱스를 작성할 때는 해당 인덱스가 어느 테이블의 어느 열에 관한 것인지 지정할 필요가 있다.

이때 열은 복수로도 지정할 수 있다.

CREATE INDEX sample_index ON sample_table(id);

//OR

CREATE INDEX sample_index ON sample_table(id, name);

2. 인덱스 삭제

인덱스는 DROP INDEX 명령으로 삭제한다.

DROP 할 때는 다른 객체와 동일하게 인덱스 이름만 지정하면 된다.

DROP INDEX sample_index;

다만 테이블 내 객체로서 존재하는 경우(SQL Server, MySQL 등)에는 테이블 이름도 지정한다.

이때 인덱스를 구성하는 열은 지정할 필요가 없다.

DROP INDEX sample_index ON sample_table;

3. EXPLAIN

인덱스 작성을 통해 쿼리의 성능 향상을 기대할 수 있다.

이때 실제로 인덱스를 사용해 검색하는지를 확인하려면 EXPLAIN 명령을 사용한다.

EXPLAIN 명령의 문법은 간단하다.

EXPLAIN에 뒤이어 확인하고 싶은 SELECT 명령 등의 SQL 명령을 지정하면 된다.

다만 이 SQL 명령이 실제로 실행되지는 않는다.

어떤 상태로 실행되는지를 데이터베이스가 설명해줄 뿐이다(MySQL의 경우 상황에 따라 필요한 정보를 얻기 위해 SQL 명령의 일부분을 실제로 실행하는 경우도 있다).

한편 EXPLAIN은 표준 SQL에는 존재하지 않는, 데이터베이스 제품 의존형 명령이다.

하지만 어떤 데이터베이스 제품이라도 이와 비슷한 명령을 지원한다.

EXPLAIN SELECT * FROM sample_table WHERE id=2;

sample_table의 id 열에는 sample_index라는 인덱스가 작성되어 있다.

EXPLAIN의 뒤를 잇는 SELECT 명령은 id 열의 값을 참조해 검색하므로 sample_index를 사용해 검색한다.

possible_keys 라는 곳에 사용될 수 있는 인덱스가 표시되며, key사용된 인덱스가 표시된다.


4. 최적화

SELECT 명령을 실행할 때 인덱스의 사용 여부를 선택한다는 것을 알았다.

이는 데이터베이스 내부의 최적화에 의해 처리되는 부분이다.

내부 처리에서는 SELECT 명령을 실행하기에 앞서 '실행계획'을 세운다.

실행계획에서는 '인덱스가 지정된 열이 WHERE 조건으로 지정되어 있으니 인덱스를 사용하자'와 같은 처리가 이루어진다.

EXPLAIN은 이 실행계획을 확인하는 명령이다.

profile
Backend Engineer

0개의 댓글