: 뛰어난 성능을 보장 하지 않지만, 계속해서 데이터가 변경되는 환경에서 균형이 잘잡혔다는 장점이 있다.
*카디널리티 : 중복도가 낮으면, 카디널리티가 높다.
ex. 이름은 주민등록번호에 비해 카디널리티카 낮다.*BI(Business Intelligence, 비즈니스 결정을 최적화 하기 위한 행위), DWH(data warehousing)
▶︎ 인덱스 필드 집합의 조건 :
① 카디널리티⬆️
② 선택률⬇️ → 5~10%이하 권장, 10%초과시 풀스캔이 유리할 수 있다.
낮을수록 접근 데이터량이 적어서 좋다!
→ 인덱스 설계시 테이블의 정의와 SQL만 봐서는 불가능. 검색조건과 결합조건으로 고려해야함. (이는 즉, 어플리케이션의 구현에 의해 인덱스의 설계가 영향을 받는다고 할 수 있음)
SELECT col1
FROM tableA;
① 카디널리티가 매우 낮은 필드 (선택률이 매우 높음)
SELECT col1
FROM tableA
WHERE flag = '1'; // flag에 가능한 값 (1, 0)
flag = '1'
인 데이터가 전체 데이터의 80%, 선택률이 80% → 이는 풀스캔보다 더 성능저하를 발생시킬 수 있다.
② 입력 매개변수에 따라 선택률이 변동
SELECT col1
FROM tableA
WHERE reg_date BETWEEN :s_date AND :e_date;
① LIKE - 중간/후방일치
SELECT col1
FROM tableA
WHERE col_nm LIKE '%대공원%';
중간/후방일치의 경우 모두 풀스캔
② 색인필드로 연산
// NOPE!!
SELECT col1
FROM tableA
WHERE col1*1.1 > 100;
// OK!!
SELECT col1
FROM tableA
WHERE col1 > 100/1.1;
col1*1.1 > 100
의 경우 인덱스를 사용하지 못함 → 우변으로 이항해서 col1 > 100/1.1
으로 사용하면, 인덱스 사용 가능③ IS NULL 사용
SELECT col1
FROM tableA
WHERE col_nm IS NULL;
④ 함수 사용
SELECT col1
FROM tableA
WHERE LENGTH(col_nm) = 10;
⑤ 부정형 사용
SELECT col1
FROM tableA
WHERE col_nm <> 100;
애플리케이션 로직을 통해 입력제한을 주는 것이다.
성능
과 사용성
의 트레이드오프를 통해 타협점을 찾아야한다.DB엔지니어
와 애플리케이션 엔지니어
사이의 커뮤니케이션을 통해, 설계단계에서 DB성능을 고려한 협의가 필요하다.데이터 마트 = 개요 테이블 = 집계 테이블
GROUP BY
를 통한 집계를 많이 사용좀비마트
발생으로 저장소 용량 압박, 백업 또는 스냅샷 시간이 오랜걸리는 문제가 발생한다. I/O감소
와 실시간 데이터
제공의 이점이 있다.커버링 인덱스
→ SELECT구문의 필드를 커버하는 인덱스가 존재하면 인덱스 온리스캔
가능Reference