EXPLAIN
SELECT payout_partner_id, country_id, value, data, payout_currency, settlement_rate, created_at, updated_at
FROM {테이블}
WHERE (country_id, payout_partner_id, seq)
IN (SELECT country_id, payout_partner_id, MAX(seq) FROM {테이블}
WHERE created_at > DATE_SUB(NOW(), INTERVAL 3 DAY )
GROUP BY country_id, payout_partner_id)
ORDER BY seq DESC
다음은 매번 쌓이는 데이터이므로 데이터가 너무 많아 3일로 제한했다.
WHERE created_at > DATE_SUB(NOW(), INTERVAL 3 DAY )
using filesort : 정렬
using temporary : 가상 테이블 생성
GROUP BY 시 기본적으로 정렬을 해서 조회를 한다.
ORDER BY NULL 로 처리하여 using filesort를 제거한다.
MySQL 엔진이 스토리 엔진으로부터 받아온 레코드를 정렬하거나 그룹핑 할 때는 내부적인 임시 테이블을 사용한다.
MySQL 엔진이 사용하는 임시 테이블은 처음에는 메모리에 생성되었다가 테이블의 크기가 커지면 디스크로 옮겨진다.
원본 테이블의 스토리지 엔진과 관계없이 임시 테이블이 메모리를 사용하 ㄹ때는 Memory 스토리지 엔진을 사용하며, 디스크에 저장될 때는 MyISAM 스토리지 엔진을 이용한다.
임시테이블이 필요한 경우
- ORDER BY와 GROUP BY에 명시된 컬럼이 다른 쿼리
- ORDER BY나 GROUP BY에 명시된 컬럼이 조인의 순서상 첫 번째 테이블이 아닌 쿼리
- DISTINCT와 ORDER BY가 동시에 존재하는 경우 또는 DISTINCT가 인덱스로 처리되지 못하는 쿼리
- UNION이나 UNION DISTICT가 사용된 쿼리
- UNION ALL이 사용된 쿼리
- 쿼리의 실행 계획에서 select_type이 DERIVED인 쿼리
1 - 3번째 경우는 Extra 컬럼에 Using Temporary가 표시
4 - 6 번째의 경우에는 Extra 컬럼에 Using Temporary가 표시되지 않지만 임시테이블이 사용.
주의사항
내부 임시테이블이 MyISAM 엔진으로 디스크에 생성되면 성능이슈가 발생한다.
내부 임시 테이블이 디스크에 생성되었는지 여부를 파악하는 명령어
SHOW SESSION STATUS LIKE '컬럼명%';
※ 만약 처리해야하는 레코드 건 수가 많다면 해당 건의 데이터 디스크에 저장된다면 큰 부하가 발생한다.
* Index 를 통해 조회하도록 처리.
ubuntu mysql 설치 (1) | 2022.12.20 |
---|---|
[intellij] 클래스 파일 빨간색 표시 (0) | 2022.11.22 |
The Tomcat connector configured to listen on port 9999 failed to start. (0) | 2022.07.28 |
shell script 로그 수집 개선 (0) | 2022.06.14 |
[Ubuntu] crontab 현재 날짜 파일명으로 사용하기 (0) | 2022.06.03 |