100줄이 넘는 쿼리를 조금씩 수정해서 덧붙여 나가면서 쓰다보면 쿼리가 왠지 늦어지는 것 같은데..? 하는 생각이 들고 쿼리 튜닝 욕구가 올라온다. 이번에 업무량이 과하지 않아서 조금씩 튜닝을 해 볼 기회가 생겨 틈틈이 공부하는 중인데, 마침 어제 동료 한 분이 요새 공부 잘 되어 가냐고 물어봐서 정리한 것을 공유한다.
목표 : 인덱스 잘 타네요 라고 말할줄 아는 사람이 된다.
Mysql 튜닝에 관한 내용입니다. (빅쿼리 X . 빅쿼리는 쿼리콘솔에서 따로 확인 가능)
1인덱스 2잘 타네요 에서 인덱스란.
인덱스란 튜닝 용어임.
튜닝할때 오브젝트를 스캔하는 유형은 테이블 스캔과 인덱스 스캔이 있음.
- 테이블 스캔 : 인덱스를 거치지 않고 바로 디스크에 위치한 테이블 데이터에 접근하는 유형.
- 인덱스 스캔 : 인덱스로 테이블 데이터를 찾아가는 유형.
스캔 방식
현업에서 주로 사용하는 스캔 방식으로는, 테이블 스캔 유형 중에서는 테이블 풀 스캔 방식, 인덱스 스캔 유형 중에서는 인덱스 범위 스캔, 인덱스 풀 스캔, 인덱스 고유 스캔, 인덱스 루스 스캔, 인덱스 병합 스캔 방식이 있음.
테이블 풀 스캔
인덱스 안 거치고 테이블로 바로 직행해서 처음부터 끝까지 데이터 훑어보는 방식. where절의 조건문을 기준으로 활용할 인덱스가 없다거나, 전체 데이터 대비 대량의 데이터가 필요할때 수행.
성능 면에서 부정적으로 해석됨. 테이블 풀 스캔은 인덱스 없이 사용하는 유일한 방식임.
인덱스 범위 스캔
인덱스를 범위 기준으로 스캔한 뒤 스캔 결과를 토대로 테이블 데이터 찾아감. between~and , < , > , like 구문 등 비교 연산, 비교 구문에 포함될 경우 수행.
좁은 범위를 스캔할때는 성능적으로 매우 효율적이나, 넓은 범위를 스캔할때는 오히려 비효율적임.
인덱스 풀 스캔
인덱스를 처음부터 끝까지 수행. 테이블에 접근하지 않고 인덱스로 구성된 열 정보만 요구하는 Sql문에서 수행.
테이블 풀 스캔 방식보다 성능상 유리하지만, 인덱스라는 오브젝트 전 영역을 모두 검색하는 방식인 만큼 검색 범위를 최대한 줄이는 방향으로 튜닝 필요.
인덱스 고유 스캔
기본키나 고유 인덱스로 테이블에 접근하는 방식. where절에 = 조건으로 작성. 해당 조인 열이 기본키 또는 고유 인덱스의 선두 열로 설정되었을때 활용.
가장 효율적인 스캔 방법
인덱스 루스 스캔
인덱스의 필요한 부분들만 골라 스캔. where + group by , Max() , min() 함수가 포함되면 작동. 이미 오름차순으로 정렬된 인덱스에서 최댓값이나 최솟값이 필요한 경우.
where 절 조건문 기준으로 필요 데이터와 불필요 데이터 구분한뒤 불필요 인덱스 무시.
인덱스 병합 스캔
테이블 내에 생성된 인덱스들을 통합(결합, 교차)해서 스캔하는 방식. WHERE 문 조건절들의 열들이 서로 다른 인덱스로 존재하면 옵티마이저가 해당 인덱스를 가져와서 모두 활용.
물리적으로 존재하는 개별 인덱스를 각각 수행하므로 인덱스 접근 시간이 배로 걸림. 따라서 별개로 생성된 인덱스를 보통 하나의 인덱스로 통합 하거나 sql 문자체를 독립된 하나의 인덱스만 수행하도록 변경하는 튜닝을 진행.
(출처 : 업무에 바로 쓰는 SQL 튜닝)
여담
사실 찐 시작은 이러했음
이후에 세현님은 아직 공부 시작을 못 하신듯 하고, 나도 따로 스터디를 진행해보지는 못했지만.. 공부는 하고 있다 이거야!
'sql' 카테고리의 다른 글
sql 윈도우 함수 count over partition by (Feat.리트코드) (0) | 2023.01.25 |
---|---|
sql join 예제(조건에 따른 join) (0) | 2023.01.17 |
mysql 누적집계 sum over (0) | 2022.12.26 |