Sql 인덱스
인덱스
인덱스는 테이블에 붙여진 색인이라 할 수 있다.
인덱스의 역할은 검색속도의 향상입니다.
검색은 탐색이라고도 불립니다.
테이블에 인덱스가 지정되어 있으면 ㅎ율적으로 검색할 수 잇으므로 where 로 조건이 지정된 select 명력의 처리 속도가 향상된다.
책을 예로 들어보면, 책의 목차나 색인 역시 인덱스라고 생각하면 쉽게 이해할 수 있다.
책안에 있는 특정한 부분을 찾고 싶은 경우, 본문을 처음부터 읽기보다는 목차나 색인을 참고해서 찾는 편이 효율적이다. 인덱스가 바로 이런 역할을 하는 것이다.
목차나 색인에 제목, 키워드별 페이지 번호가 적혀있듯 데이타베이스의 인덱스에는 검색시에 쓰이는 키워드와 대응하는 데이터 행의 장소가 저장되어 있다.
인덱스는 테이블과는 별개로 독립된 데이터베이스 객체로 작성된다.
인덱스는 테이블에 의존하는 객체이다.
대부분의 데이터베이스에서는 테이블을 삭제하면 인덱스도 같이 삭제된다.
효율적으로 검색할 수 있는 이유.
데이터베이스의 인덱스에 쓰이는 대표적인 검색 알고리즘으로는 '이진트리'가 있으며, 그 다음으로 '해시'가 유명하다.
-풀 테이블 스캔(full table scan)
인덱스가 지정되지 않은 테이블을 검색할 때는 풀 테이블 스캔이라 불리는 검색 방법을 사용한다.
테이블에 저장된 모든 값을 처음부터 차례로 조사해나가는 방법.
-이진 탐색(binary search)
이진 탐색은 차례로 나열된 집합에 대해 유요한 검색 방법이다.
집합을 반으로 나누어 조사하는 검색방법이다.
대량의 데이터를 검색할 때는 이진 탐색이 빠르다!
-이진 트리(binary tree)
테이블에 인덱스를 작성하면 테이블 데이터와 별개로 인덱스용 데이터가 저장장치에 만들어진다.
이때 이진 트리라는 데이터 구조로 작성된다.
트리는 노드라는 요소로 구성된다.
각 노드는 두 개의 가지로 나뉘게 된다.
노드의 왼쪽 가지는 작은 값으로, 오른쪽 가지는 큰 값으로 나뉘어져 있다.
이진 트리에는 중복하는 값을 등록할 수 없다. (유일성)
인덱스 작성과 삭제
표준 SQL에는 create index 명령은 없습니다. 인덱스 자체가 데이터베이스 제품에 의존하는 선택적인 항목으로 취급된다. 하지만 대표적인 DB 제품에는 모두 인덱스 구조가 도입되어 있으며, 모두 비슷한 관리 방법으로 인덱스를 다룰 수 있다.
1. 인덱스 작성
인덱스를 작성할 때는 해당 인덱스가 어느 테이블의 어느 열에 관한 것인지 지정할 필요가 있다.
이때 열은 복수로도 지정할 수 있다.
인덱스의 네임스페이스가 데이터베이스 제품마다 다르다는 점만 주의하면 문법은 그렇게 어렵지 않다.
CREATE INDEX 인덱스명 ON 테이블명 (열명1, 열명2,...)
2. 인덱스 삭제
(스키마 객체의 경우)
DROP INDEX 인덱스명
(테이블 내 객체의 경우)
DROP INDEX 인덱스명 ON 테이블명
인덱스는 테이블에 의존하는 객체이다.
따라서 테이블을 삭제하면 테이블에 작성된 인덱스도 자동으로 삭제 된다.
3. EXPLAIN
실제로 인덱스를 사용해 검색하는지를 확인하려면 EXPLAIN 명령을 사용합니다.
EXPLAIN 에 뒤이어 확인하고 싶은 SQL명령을 지정하면 된다.
다만 이 명령은 실제로는 실행되지 않는다. 어떤 상태로 실행되는지를 DB가 설명해줄 뿐이다.
4. 최적화
내부 처리에서는 SELECT 명령을 실행하기에 앞서 실행계획을 세웁니다.
실행계획에서는 '인덱스가 지정된 열이 WHERE 조건으로 지정되어 잇으니 인덱스를 사용하자'와 같은 처리가 이루어집니다.