29강 인덱스 작성과 삭제
CREATE INDEX
DROP INDEX
인덱스 작성
oracle, db2 등에서 인덱스는 스키마 객체가 되어 스키마 내에 이름이 중복하지 않도록 관리해야한다. sql server, mysql에서는 인덱스가 테이블 내의 객체가 된다. 그래서 이는 테이블 내에 이름이 중복되지 않도록 관리해야한다.
CREATE INDEX indexsample ON sample(no)
위의 예는 sample 테이블의 no열에 indexsample이라는 인덱스를 지정한다.
인덱스를 작성할 때 저장장치에 색인용 데이터가 만들어진다. 테이블 크기에 따라 인덱스 작성시간도 달라지는데, 행이 대량으로 존재하면 시간도 많이 걸리고 저장공간도 많이 소비한다.
인덱스 삭제
DROP INDEX indexsample ON sample;
위의 예는 sample 테이블의 indexsample이라는 인덱스를 삭제한 것이다.
인덱스는 테이블에 의존하는 객체이다. 그래서 테이블을 삭제하면 인덱스도 같이 삭제된다. 인덱스만 삭제하는 경우에 이를 사용한다.
SELECT
명령에서의 인덱스
CREATE INDEX indexsample ON sample(a);
SELECT * FROM sample WHERE a = 'a';
WHERE
구에 a열에 대한 조건식을 지정한 경우 SELECT
명령은 인덱스를 사용해 빠르게 검색할 수 있다. 그러나 WHERE
구의 조건식에 a열이 사용되지 않으면 SELECT
명령은 indexsample
인덱스를 사용할 수 없다.
EXPLAIN
실제로 인덱스를 사용해 검색하는지 확인하려면 EXPLAIN
명령을 사용한다.
EXPLAIN
명령 문법은 EXPLAIN
의 뒤에 확인하고 싶은 SQL명령을 지정하면 된다. 다만 이 명령은 실제로 실행되지 않는다. 데이터베이스가 어떤 상태로 실행되는지를 설명해주는 역할만 수행한다.
EXPLAIN SELECT * FROM sample WHERE a = 'a';
possible_keys
라는 곳에 사용될 수 있는 인덱스가 표시되며, key
는 사용된 인덱스가 표시된다.
인덱스가 없는 열을 조건식으로 둘 경우, possible_keys
와 key
엔 NULL
이라고 표시된다.
최적화
SELECT
명령을 실행할 때 인덱스의 사용 여부를 선택한다는 것을 알게 되었다. 이는 데이터베이스 내부의 최적화에 의해 처리되는 부분이다.
내부 처리에서는 SELECT
명령을 실행하기에 앞서 실행계획을 세운다. EXPLAIN
명령은 이 실행계획을 확인하는 명령이다.
실행계획에서는 인덱스의 유무, 인덱스를 사용할 것인지 판단 여부, 인덱스의 품질 등을 데이터베이스 내부의 최적화 처리를 통해 판단한다. 이를 고려해 실행계획이 세워진다.