인덱스
- 인덱스는 데이터베이스에서 키값으로 실제 데이터 위치를 식별하고 데이터 접근 속도를 높이고자 생성되는, 키 기준으로 정렬된 오브젝트이다.
- 저장된 데이터를 검색할 일이 많을 때는 인덱스를 설계하고 생성하는 과정이 매우 중요하다.
- 인덱스는 생성하려는 열의 속성에 따라 고유 인덱스와 비고유 인덱스로 구분할 수 있다.
고유 인덱스
- 고유 인덱스란 인덱스를 구성하는 열들의 데이터가 유일하다는 의미로, 차례로 정렬되는 인덱스 열의 데이터는 서로 중복되지 않고 유일성을 유지한다.
- 만약 동일한 데이터가 생성되면 고유 인덱스의 중복 체크 과정에서 에러가 발생한다.
- 또한, 중복이 없는 열들을 고유 인덱스로 생성하려 한다면 중복이 있는지 검증하는 절차를 거쳐햐 하므로, 불필요한 중복 검증 과정이 추가되므로 주의해야 한다.
ALTER TABLE 테이블명
ADD UNIQUE INDEX 인덱스명(칼럼명);
※ 참고: 기본키에는 NULL을 입력할 수 없지만 고유 인덱스에는 NULL을 입력할 수 있다.
비고유 인덱스
- 비고유 인덱스는 고유 인덱스에서 데이터의 유일한 속성만 제외한 키이다.
- 데이터가 신규 입력되어 인덱스가 재정렬되더라도 인덱스 열의 중복 체크를 거치지 않고 단순한 정렬 작업만 수행한다.
ALTER TABLE 테이블명
ADD INDEX 인덱스명(칼럼명);
오브젝트 스캔
- 오브젝트 스캔 유형은 테이블 스캔과 인덱스 스캔으로 구분한다.
- 테이블 스캔은 인덱스를 거치지 않고 바로 디스크에 위치한 테이블 데이터에 접근하는 유형이며, 인덱스 스캔은 인덱스로 테이블 데이터를 찾아가는 유형이다.
- 테이블 스캔 유형으로는 테이블 풀 스캔 방식이 있으며, 인덱스 스캔 유형으로는 인덱스 범위 스캔, 인덱스 풀 스캔, 인덱스 고유 스캔, 인덱스 루스 스캔, 인덱스 병합 스캔 방식이 있다.
테이블 풀 스캔
- 인덱스를 거치지 않고 테이블로 바로 직행하여 처음부터 끝까지 데이터를 훑어보는 방식으로, 인덱스 없이 사용하는 유일한 방식
- WHERE 절의 조건문을 기준으로 활용할 인덱스가 없거나, 전체 데이터 대비 대량의 데이터가 필요할 때 테이블 풀 스캔을 수행한다.
- 보통 처음부터 끝까지 데이터를 검색하므로 성능 측면에서 좋지 않다.
인덱스 범위 스캔
- 인덱스를 범위 기준으로 스캔한 뒤 스캔 결과를 토대로 테이블의 데이터를 찾아가는 방식
- SQL 문에서 BETWEEN ~ AND 구문이나 <, >, LIKE 구문 등 비교 연산 및 구문에 포함될 경우 인덱스 범위 스캔을 수행한다.
- 좁은 범위를 스캔할 때는 성능적으로 매우 효율적이지만 넒은 범위를 스캔할 때는 비효율적
인덱스 풀 스캔
- 인덱스를 처음주터 끝까지 스캔하는 방식으로, 테이블에 접근하지 않고 인덱스로 구성된 열 정보만 요구하는 SQL 문에서 수행된다.
- 인덱스는 테이블보다 상대적으로 적은 양을 차지하므로 테이블 풀 스캔 방식보다 성능상 유리하다.
- 하지만 인덱스라는 오브젝트의 전 영역을 모두 검색하는 방식이므로, 검색 범위를 최대한 줄이는 방향으로 SQL 튜닝이 필요하다.
인덱스 고유 스캔
- 기본키나 고유 인덱스로 테이블에 접근하는 방식으로, 인덱스를 상요하는 스캔 방식 중 가장 효율적인 스캔 방식
- WHERE 절에 = 조건으로 작성하며, 해당 조인 열이 기본키 또는 고유 인덱스의 선두 열로 설정되었을 때 활용한다.
인덱스 루스 스캔
- 인덱스의 필요한 부분들만 골라 스캔하는 방식
- 인덱스 범위 스캔처럼 넓은 범위에 전부 접근하지 않고, WHERE 절 조건문 기준으로 필요한 데이터와 필요하지 않은 데이터를 구분한 뒤 불필요한 인덱스 키는 무시한다.
- 보통 GROUP BY 구문이나 MAX(), MIN() 함수가 포함되면 작동한다. (예를들어, 오름차순으로 정렬된 인덱스에서 최대값이나 최소값이 필요한 경우)
인덱스 병합 스캔
- 테이블 내에 생성된 인덱스들을 통합해서 스캔하는 방식으로, WHERE 문 조건절의 열들이 서로 다른 인덱스로 존재하면 옵티마이저가 해당하는 인덱스를 가져와서 모두 활용하는 방식
- 통합하는 방법으로는 union과 intersection 방식이 있으며, 모두 실행 계획으로 출력된다.
- 인덱스 병합 스캔은 물리적으로 존재하는 개별 인덱스에 대해 각각 수행되므로 시간이 오래 걸린다.
- 따라서, 별개로 생성된 인덱스들은 보통 하나의 인덱스로 통합하여 SQL 튜닝을 수행하거나, SQL 문 자체를 독립된 하나의 인덱스에서만 수행되도록 변경할 수 있다.
'Computer Science > SQL Tuning' 카테고리의 다른 글
테이블 JOIN 튜닝 (0) | 2022.02.22 |
---|---|
SQL 문 튜닝 (0) | 2022.02.22 |
SQL 프로파일링 (0) | 2022.02.21 |
MySQL과 MariaDB 실행 계획 (0) | 2022.02.21 |