-
2024.07.10~11 Query TuningTIL 2024. 7. 11. 23:33
쿼리 튜닝을 해야 하는 일이 있다.
- 쿼리에서 불필요한 join이 있는지 확인하고 삭제 처리를 하자.
- group by 절까지 삭제가 가능할 수 있다.
- 임시 테이블 사용 가능성이 있어 삭제할 수 있음 하자
- group by 절이 내부적으로 어떻게 동작하는가? -> 공부 필요
- group by 절까지 삭제가 가능할 수 있다.
- count 쿼리의 성능 저하
- 페이징 기능 구현 중 count 쿼리가 필요하다
- 데이터가 증가하면 할수록 count 쿼리가 느려진다
- index를 사용함에 불구하고 느리다
- 클러스터드 인덱스 값을 사용하게 되면 더 느린데 이유는 무엇인가
- 인덱스 값뿐 아니라 저장된 데이터까지 읽어야 하기 때문인가
- 커버링 인덱스
- 수정 대상이 검색 쿼리다. 조건절이 많은 join과 연관이 있고 동적으로 변화된다.
- 커버링 인덱스를 설계할 수 있을까? 조건의 순서를 정하고 인덱스를 설계해야 한다.
- join의 인덱스가 where 절에 있다면 이거도 영향이 있지 않을까?
- join 시 드라이빙 테이블에 따라 쿼리의 성능 저하
- 드라이빙 테이블과 order by절에서 사용하는 컬럼이 다른 테이블이라면 explain에 Using temporary; Using filesort가 노출
- join 시 드라이빙 테이블을 정하는 것은 옵티마이저의 역할
- 인덱스가 다 걸려있다면 join 테이블의 데이터 수로 결정되는 거일까?
- 데이터가 적어야 Nested loop 도는 횟수가 적어져서인가
- mysql에서 정렬은 인덱스 정렬과 파일소트인데 인덱스를 사용할 수 없으면 파일소트이다
- 파일소트는 인덱스 정렬보다 느리다.
- 드라이빙 테이블에서의 파일소트(Using filesort)
- 임시테이블과 함께 파일소트도 가능하다.( Using temporary; Using filesort )
- 일대일 join이면 임시 테이블에 넣는다고 더 느려질까?
- 임시 테이블 자체가 디스크까지 넘어가면 느리다고는 하는데. 디스크로 넘어가지 않을 정도의 양이면 인덱스정렬 보다 얼마나 느린가?
- 파일소트는 인덱스 정렬보다 느리다.
- join 시 드라이빙 테이블을 정하는 것은 옵티마이저의 역할
- 드라이빙 테이블 고정
- mysql은 STRAIGHT_JOIN을 통해 드라이빙 테이블을 고정할 수 있다.
- 옵티마이저가 결정한 드라이빙테이블이 order by절까지 고려하지 못한 것으로 생각되며 드라이빙 테이블을 고정했다.
- with 절로 쿼리 분할
- STRAIGHT_JOIN을 사용하기 싫다면 id값만 뽑는 sql을 with절로 분리해 보자
- 검색 조건은 with절에서 다 소화한다
- 조회 컬럼에 따라 Using temporary; Using filesort 노출여부가 바뀔 수 있나?
- 이후 with절과 원본 테이블이 join 해서 검색 결과를 뽑아내자
- STRAIGHT_JOIN을 사용하기 싫다면 id값만 뽑는 sql을 with절로 분리해 보자
- 드라이빙 테이블과 order by절에서 사용하는 컬럼이 다른 테이블이라면 explain에 Using temporary; Using filesort가 노출
SQL - Using Temporary, Using Filesort 정리드라이빙 테이블count 쿼리인덱스 머지에관한.. index_merge. Using intersect는 또 어떻게 동작하는가
음
더 공부해 보고 정리해 보자.
데드락이랑 인덱스 쪽을 건드려야 하니 요즘 DB 공부를 하고 있다.
아직 확실하지 않은 것은 밑줄을 쳐놨고 나중에 고치자
'TIL' 카테고리의 다른 글
2024.07.19 분산 트랜잭션, TCC (0) 2024.07.20 2024.07.12 포프 (0) 2024.07.12 2024.07.09 locking Introduction (0) 2024.07.09 2024.07.07 How to Minimize and Handle Deadlocks (0) 2024.07.07 2024.07.04~06 deadlock detection (0) 2024.07.07 - 쿼리에서 불필요한 join이 있는지 확인하고 삭제 처리를 하자.