SELECT.. WHERE 쿼리를 빠르게 하기 위해 index를 설정할 것
- OR 연산은 성능 저하의 원인이 됨. 가급적 사용하지 않기
(a > 5 AND b = 10) OR (a > 7 AND b = 10)
a> AND b = 10
함수 호출은 최소화
- 함수 호출을 위해 전체 테이블을 풀스캔하며 비효율적인 연산을 할 수 있음
테이블 full scan을 최소화
- 특히 큰 테이블의 경우 full scan 으로 인한 비용이 큼
주기적으로 ANALYZE TABLE 문 호출하기
- 테이블 통계 상태를 최신화하여, 옵티마이저가 효율적인 실행 계획을 구성하도록 도움
이해하기 어려운 쿼리 사용을 피하기
- 옵티마이저가 자동으로 최적화하를 못할 수 있음
EXPLAIN plan 을 읽고 Index, where, join 등을 조절하기
반복 사용되는 쿼리를 위해 buffer pool, query cache 사이즈 조절
LOCK 이슈 처리
- 동시에 테이블에 접근하는 서로 다른 세션에 영향
- locking 옵션 체크
- SELECT 시 lock 을 거는지 확인
B-Tree index 는 range 조건에 사용 가능
- =, IN, <, >, <=, >=, BETWEEN, LIKE
Hash Index 는 equal 조건에 사용 가능
OR 쿼리는 single range scan 에 사용 불가
Index Merge Optimization
- 인덱스를 이용하여 테이블을 읽는 경우 대부분은 하나의 인덱스만 활용할 수 있다.
- 인덱스 머지 실행계획을 사용하면 하나의 테이블에 대해 2개 이상의 인덱스를 이용하게 된다.
CREATE INDEX idx1 ON A (a1);
CREATE INDEX idx2 ON A (a2);
SELECT FROM A WHERE a1 = 3 AND a2 = 4; // index scans & intersection
SELECT FROM A WHERE a1 = 3 OR a2 = 4; // index scans & union
Hash Join Optimization
- Join 조건에 Index 가 없을 때 Hash Join 이 일어날 수 있음.
Outer Join 이 nested loop join 을 사용