SQL NOT으로 반대 조건을 읽기 쉽게 표현하기
서로 반대되는 조회 옵션을 구현할 때 NOT으로 조건의 관계를 명확하게 표현하는 방법을 정리한다.
데이터베이스, SQL, 잠금과 성능을 다룹니다.
글 16개서로 반대되는 조회 옵션을 구현할 때 NOT으로 조건의 관계를 명확하게 표현하는 방법을 정리한다.
행마다 달라지는 날짜 하한 때문에 created_at 인덱스를 쓰지 못한 쿼리에, 기존 결과를 보존하는 고정 후보 범위를 추가한 근거를 보여준다.
비정상적인 extra_days 하나가 날짜 계산을 NULL로 만들거나 조회 범위를 넓힐 수 있어, 입력 검증과 인덱스 회귀 확인을 함께 둔 이유를 설명한다.
수정 전후 서버에 같은 fixture와 요청을 보내 배열 순서·커서·필드까지 비교하고, 성능 측정과 결과 검증을 분리한 방법을 보여준다.
AI 사이드 프로젝트에서 Flyway의 버전 순서를 유지하면서 out-of-order, 중복 SQL과 겹치는 배포를 CI·배포 큐·DB 제약으로 나눠 막은 판단을 다룬다.
AI 사이드 프로젝트에서 머지·배포 순서가 어긋나 낮은 버전이 뒤늦게 나타나고, 같은 백필이 다른 버전으로 두 번 적용된 원인을 보여준다.
published가 인덱스 밖에 있어 조건부 MAX 최적화가 깨진 원인과, 역순 인덱스 탐색이 유효한 데이터 분포 조건을 설명한다.
원본 테이블 크기보다 필터 후 행 수·안쪽 인덱스 비용·EXPLAIN ANALYZE의 loops로 nested-loop 조인 순서를 판단한다.
SELECT 사전 확인의 경쟁 조건을 유니크 키로 막고, 예상한 DuplicateKeyException만 도메인 중복으로 처리하는 기준을 제시한다.
일반 SELECT와 UPDATE 사이의 경쟁을 MVCC 문제와 구분하고, 변경 조건을 UPDATE에 넣어 원자적으로 판정한 이유를 설명한다.
OFFSET 페이징에서 같은 행이 다시 보인 원인을 고유하지 않은 ORDER BY에서 찾고, 마지막 정렬 키와 커서 페이징을 비교한다.
재전송된 요청이 OPEN → OPEN도 성공으로 판정해 포인트를 두 번 차감한 원인과, 조건부 UPDATE로 한 번만 처리하게 한 방법을 보여준다.
sys.innodb_lock_waits, INNODB_TRX, 실행 계획을 연결해 waiter·blocker·잠긴 인덱스와 트랜잭션 시간을 찾는 순서를 제시한다.
한 트랜잭션이 행을 수정하는 동안 일반 SELECT와 locking read가 어떻게 다르게 동작하는지 InnoDB의 잠금과 MVCC로 설명한다.
한글 부분 검색에서 제한된 LIKE와 ngram FULLTEXT가 만드는 결과·토큰·색인 비용을 비교해, 이번에는 LIKE를 유지한 기준을 제시한다.
앞선 할당으로 바뀐 값을 다음 식이 읽는 MySQL 단일 테이블 UPDATE 동작과, 순서 의존 SQL을 테스트로 고정하는 기준을 제시한다.