Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- fractional seconds
- 티스토리챌린지
- EmbeddedId
- 오블완
- spring boot
- getEntityGraph
- @CreateDate
- NamedEntityGraph
- mysql not equal null
- load order
- mysql equal null
- yml
- 운동해서 광명찾자
- https
- AuditingEntityListener
- getDateCellValue
- +9:00
- pooled-lo
- MYSQL
- @EntityListeners
- MSSQL
- 버전 문자열 비교
- 1*1000
- RootGraph
- mysql =
- Protecle
- sendFractionalSeconds
- createEntityGraph
- apatch poi
- deserializer
Archives
- Today
- Total
Hello
조회 쿼리 sort 성능 개선 본문
728x90
회사에서 DB 모니터링을 진행하고 있어 개선 해야하는 쿼리들을 공유 받았다.
그 중 조회 쿼리 개선을 요청 받은 것이 있어 몰랐던 부분을 알게되어 정리한다.
CREATE TABLE `tb_test` (
`seq` INT(11) NOT NULL AUTO_INCREMENT,
`string_data1` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
`string_data2` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
`number_data3` BIGINT(20) NOT NULL,
`date` DATETIME NOT NULL,
INDEX 'seq' (`seq`) USING BTREE,
INDEX `date` (`date`) USING BTREE,
INDEX `string_data1` (`string_data1`) USING BTREE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
위와 같이 테이블이 있고 인덱스가 잡혀있을 때 기존에 조회 쿼리를 사용하고 있었다.
SELECT * FROM tb_test WHERE `date` BETWEEN '2023-01-01' AND '2023-02-01' ORDER BY seq DESC;
나는 seq, date 각각 인덱스가 잡혀 있기 때문에 seq로 정렬을 해도 문제가 없다고 생각했는데 전혀 아니었다.
date 인덱스를 통한 결과값 검색 후, 별개의 인덱스인 Seq 컬럼 Sort 로 인해 비용 발생
그렇기 때문에 인덱스를 통해 검색을 했으면 해당 인덱스로 정렬되어 있기 때문에 동일한 인덱스로 정렬하는 비용적 측면에서 유리하다.
공식문서에서 아래 내용 확인할 수 있었다.
기존 쿼리 문제
1. where에서 date 컬럼으로 조회
2. db는 date로 조회된 데이터를 정렬해서 캐시에 갖고있음
3. date로 정렬된 데이터를 seq 컬럼으로 새로 정렬함
3-1. 이 때 정렬 비용이 발생(filesort)
개선 방향
where에서 사용한 컬럼으로 정렬 처리 (filesort 미발생)
SELECT * FROM tb_test WHERE `date` BETWEEN '2023-01-01' AND '2023-02-01' ORDER BY `date` DESC;
참고 : https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html#order-by-index-use
728x90
'DB' 카테고리의 다른 글
MySql datetime 반올림 (0) | 2023.08.30 |
---|---|
[MySQL] 특정 조건일 때 join이 필요한 경우 (0) | 2023.07.28 |
MySQL delete 실행 시 Table disk size가 줄어들지 않음 (0) | 2023.05.18 |
MySQL FK on update, on delete (0) | 2023.05.17 |
REDIS SENTINEL (0) | 2023.03.09 |