* 한계 : 100개가 넘는경우, 풀스캔을함
* 해결 : In절에 담는 값을 Promise.all을 이용해 분할처리(20개씩)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
이전과는 달리 이번에는 where id in (ID) 에 포함되는 ID의 개수가 100개를 초과해서 인덱스를 사용하지 못하고 테이블 풀 스캔을 하는 쿼리의 문제였습니다.
위 쿼리는 장바구니, 구매완료, 결제페이지 등에서 신청하는 강의들의 정보를 가져오는 쿼리입니다.
(수강바구니)
이 쿼리가 평소에는 문제가 없었지만, 이번 이벤트의 경우 125개의 강의를 100% 할인하는 것이 원인이 되었습니다.
한번에 125개 강의를 모두 담아서 일괄 결제 (어차피 0원이니) 하는 수강생분들이 급증했기 때문입니다.
이 문제를 해결하기 위해서 “한번에 담는 강의의 수를 제한” 보다는 IN 절에 담는 ID를 20개씩으로 끊어서 Promise.all 로 분할처리하도록 구성하여 IN 절을 통한 인덱스 효과를 다시 사용할 수 있도록 하였습니다.
이렇게 첫 주의 할인 이벤트가 마무리 됩니다.
https://tech.inflab.com/202201-event-postmortem/
'CS > DB' 카테고리의 다른 글
[DB] DATETIME 타입에 DEFAULT 값으로 현재 시간 입력 (0) | 2024.08.27 |
---|---|
[CS] 멘토링 24.8.27. // db, redis, kafka (0) | 2024.08.27 |
[DB] unknown database error 해결 (0) | 2024.08.26 |
[DB] Connection Pool (0) | 2024.08.26 |
[DB] char VS varchar 선택기준 (0) | 2024.08.25 |