본문 바로가기
Computer Science/Database

[데이터베이스 핵심 요약] 10. 인덱스(index)

by pilgyeong 2022. 11. 13.

1. 인덱스 개념

  • 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료구조
  • 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 공간에 데이터의 물리적 주소와 함께 저장

 

2. 인덱스 알고리즘

  • 주로 B+트리 또는 B*트리 알고리즘으로 구현한다. 구체적인 것은 추후 자료구조 핵심 정리하면서 올려둘 예정.

 

3. 인덱스 사용 시 좋은 경우

  • 데이터 규모가 큰 테이블
  • 삽입, 수정, 삭제 작업이 자주 발생하지 않는 컬럼
  • WHERE나 ORDER BY, JOIN 등이 자주 사용되는 컬럼
  • 데이터 중복도가 낮은 컬럼 (= 분포도가 좋음)

 

4. 인덱스 사용 시 안 좋은 경우

  • 데이터 규모가 작은 테이블
  • 삽입, 수정, 삭제 작업이 자주 발생하는 컬럼
  • 데이터 중복도가 높은 컬럼 (= 분포도가 나쁨)
  • 추가적인 데이터 저장소가 필요 (= Cost 발생)

 

5. 인덱스 구조 방식

구조 설명
트리 기반 • OLTP 범위 검색에 자주 사용
• B+트리, root/leaf 노드 구조
해시 기반 • OLTP 키 검색에 자주 사용
• 버켓, 해시함수, 해시테이블
비트맵 기반 • data warehouse, data mark 내 데이터 검색에 주로 사용
• 비트맵 인덱스

 

해시 기반

 

비트맵 기반

 

6. 인덱스 스캔 방식

  • 만약 인덱스가 설정되어 있지 않다면, Full Scan을 하게 된다. 즉, 오래 걸린다.
  • 인덱스가 설정되어 있으면, 만들어 놓은 인덱스 기반으로 굉장히 빠르게 탐색할 수 있다.
  • 또한, Select에서 특정 컬럼만 조회할 때는 Fast Full index scan을 해서 더욱 빠르게 탐색한다.

 

7. 인덱스 스캔을 못 하는 경우

  • 인덱스 스캔을 못 하는 경우에는 디스크/테이블 Full Scan을 수행하게 된다.

형변화

SELECT reg_date FROM table_name
WHERE TO_CHAR(reg_date, 'YYYYMMDD') = '20220317';

 

NULL / NOT NULL

SELECT column_name FROM table_name
WHERE column_name IS NULL

 

부정연산

SELECT column_name FROM table_name
WHERE column_name != 30; (NOT EXISTS)

 

Like연산

SELECT column_name FROM table_name
WHERE column_name LIKE '%S%';

 

OR조건

SELECT * FROM table_name1 t1, table_name2 t2
WHERE (t1.name1 = t2.name2 OR t1.name2 = t2.name2) and t1.code='1004';