Query 최적화
- 대용량 데이터를 다룰 때 SQL 쿼리 성능을 최적화하는 것이 중요함
- 성능을 향상하고 응답 시간을 단축시키기 위해
1. 필요한 컬럼만 조회
SELECT * FROM employee; //모든 컬럼을 조회하는 것은 비효율적임
SELECT name, age FROM employee;
2. 적절한 인덱스 사용
- 인덱스를 사용하여 검색 범위를 좁힐 수 있음
- 자주 조회되는 컬럼이나 조인에 사용되는 컬럼에 인덱스를 생성.
- 특히,
WHERE
,JOIN
,ORDER BY
,GROUP BY
절에 사용되는 컬럼에 인덱스를 생성하면 성능이 향상될 수 있음
SELECT name FROM employee WHERE age = 20;
3. 와일드카드(%)는 문자열 뒤에 사용하기
- 상황마다 다르겠지만 Like 조건절에서 와일드카드는 문자열 뒤에사용해야 인덱스를 잘 활용할 수 있음
- %문자열로 사용하면 Full Table Scan 발생 → 성능 저하
- 저는 실제로 이거 수정하니깐 성능 좀 개선됨
SELECT name FROM employee WHERE name LIKE '김%';
4. GROUP BY 문에 조건절 사용 시 가능하다면 HAVING 대신 WHERE절 사용
- 쿼리 수행 순서가 WHERE이 더 빠르기 때문에 GROUP BY 전에 범위를 줄일 수 있음
SELECT COUNT(name)
FROM employee
GROUP BY age
HAVING age > 10;
SELECT COUNT(name)
FROM employee
GROUP BY age
WHERE age > 10;
5. 가급적이면 조건문에 기존 컬럼에 대한 계산 수행 사용하지 말기
- 대부분의 데이터베이스 인덱스는 컬럼의 원래 값에 대해 만들어짐
- 따라서
WHERE
절에서 컬럼에 연산이나 함수를 적용하면 인덱스를 사용할 수 없게 되어, Full Table Scan이 발생할 수 있음
SELECT * FROM employees WHERE salary * 1.1 > 50000;
- 최대한 컬럼에는 연산을 사용하지 않도록 해야함. 새로운 컬럼을 추가하는 것도 하나의 방법임(사바사니 충분히 고려해보고 만드세요)
6. 서브쿼리 대신 조인 사용
- 서브쿼리를 사용하면 성능이 떨어질 수 있음. 대체 가능하면 조인을 사용하는 것이 좋음
-- 서브쿼리 사용
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE location = 'NY');
-- 조인으로 변경
SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.id WHERE d.location = 'NY';
7. 테이블 구조 최적화
- 정규화와 비정규화: 데이터 모델링 시 정규화는 데이터 중복을 줄이고 무결성을 유지하는 데 도움이 되지만, 과도한 정규화는 조인이 많아져 성능에 악영향을 미칠 수 있음, 필요한 경우 비정규화를 통해 성능을 개선할 수 있음
- 파티셔닝: 큰 테이블을 파티셔닝하여 성능을 향상시킬 수 있음, 파티셔닝을 통해 데이터 조회 시 불필요한 파티션을 스캔하지 않도록 할 수 있음