본문 바로가기

MYSQL11

존재하지 않은 데이터에 대한 잠금의 영향 들어가며이전 글에서 삽입 연산에 대해서 발생하는 동시성 문제를 해결하기 위해서 Rediss의 분산락 또는 MySQL의 네임드락을 통해 순서를 제어한다는 글을 작성하였습니다. 하지만 이후에 비관적락에 대해 학습하다 보니, 존재하지 않은 데이터에 대해서도 잠금을 걸 수 있다는 것을 알 수 있었습니다. 그렇다면 다시 한번 삽입 과정에서 락을 통해 추가적인 구현을 할 필요성에 대해 생각해봐야 할 것 같아 글을 작성하게 되었습니다. [DB] MySQL NamedLock vs Redisson 락 관리.들어가며이전 글(https://kongdevlog.tistory.com/20)에서 Named Lock을 통해 삽입 작업에서의 동시성을 제어하였습니다.다만 이 과정에서, Redisson을 사용하는 방법이 더 좋은 방법.. 2025. 6. 15.
[DB] 인덱스와 잠금 들어가며인덱스를 통해 효율적인 탐색을 하도록 하여 DB의 성능을 높이는데 기여하는 것은 매우 중요한 사실이지만, 그 외에도 인덱스를 통해 탐색을 하며 잠금을 건다는 사실 역시 생성(Insert)/수정(Delete)에도 큰 영향을 미친다는 사실을 확인하고자 글을 작성하게 되었습니다.사전 테이블과 데이터다음과 같이 약 1만개의 데이터를 삽입하였습니다. 이제 인덱스가 걸리지 않은 데이터를 잠그는 경우, 어떤 현상이 발생하는지 직접 확인해보겠습니다.실험현재 name 컬럼에는 인덱스가 존재하지 않기 때문에select * from test_table where name = 'User_7000' for update;쿼리를 실행하고, 어떤 행들에 잠금이 걸리는지 확인해보겠습니다.이와 함께 실제 PK를 확인해보니 1만개.. 2025. 6. 2.
[DB] 조인 종류 살펴보기 (중첩 루프 조인 & 정렬 병합 조인 & 해시 조인) 들어가며실행 계획에 담긴 정보 중에 하나는 조인에 사용된 방식이 있습니다. 이를 통해 이전에 작성하였던 글인 '쿼리 속도 개선하기'에서 조인이 효율적으로 잘 동작하는지 확인할 수 있었습니다. 하지만, 내부적으로 어떤 방식으로 동작하는지에 대해서는 이해가 부족한 것 같아 글을 작성하게 되었습니다.중첩 루프 조인 (Nested Loop Join)for 문과 같은 원리로 조건에 맞는 조인을 하는 방법입니다.그림과 같이 조인의 기준이 되는 테이블(Driving Table)의 각 행이 조인 대상이 되는 테이블(Drived Table)의 각각의 행에 대해서 모두 비교를 시도합니다. 따라서 시간 복잡도는 Drived Table 의 행의 개수 ** Driving Table 의 행의 개수 가 됩니다.따라서, DBMS가 .. 2025. 4. 28.
[팀 프로젝트 & DB] 쿼리 속도 개선하기. 들어가며특정 게시글 목록을 보여줄 때, 총 3개의 테이블이 조인이 되는 쿼리가 존재하였습니다. 페이지네이션 작업을 진행하면서, 혹시 데이터가 늘어나거나 조회 조건이 추가되면 성능 저하가 있지 않을까? 하는 생각에 더미 데이터를 통한 성능 측정과 이 과정에서 쿼리를 수정하거나 인덱스를 튜닝하여 속도를 개선하는 과정을 기록하고자 글을 작성하게 되었습니다.더미데이터더미데이터를 추가할 때, 이전에 글을 작성한 것과 같이 데이터의 다양성이 떨어지면 의도한 인덱스를 타지 않고 풀스캔을 해버리는 경우. 즉, 인덱스의 효용이 떨어져 DBMS가 풀스캔을 선택하게 되는 상황을 배제하고자 데이터의 분포를 고르게 하고자 하였습니다.INSERT INTO jobs(id, name, created_at) -- 직업 더미 데이터WI.. 2025. 4. 16.
[DB] 클러스터링 인덱스 들어가며면접관님께서 최근에 어떤 것을 공부하고 있느냐고 해서, 자신있게 Real MySQL을 읽으며 데이터베이스에 대해서 공부하고 있다고 말씀드렸습니다. 그러자 클러스터링 인덱스와 비 클러스터링 인덱스에 대해서 아는지, 비교를 해달라고 하셨습니다. 해당 말씀을 듣고 저는 단일 컬럼 인덱스와 복합 컬럼 인덱스로 착각하여 말씀드리게 되었습니다. 면접관님께서는 그냥 넘어가셨지만, 면접 직후 바로 찾아보니 답변을 잘못했다는 것을 알게되고 글을 기록하며 다시 한번 기억에 남기고자 글을 작성합니다!클러스터링 인덱스란?클러스터링이란 테이블의 레코드를 비슷한 것으로 묶어서 저장하는 것을 의미합니다. 이는 MySQL에서는 InnoDB 스토리지 엔진에서만 지원합니다.클러스터링 인덱스는 프라이머리 키에 대해서만 적용되는 내.. 2025. 3. 25.
[DB & 팀 프로젝트] 실행 계획을 통해 인덱스 걸어보기! 들어가며Real MySQL 8.0 1권 책을 읽으며 조회 시, 인덱스의 중요성에 대해서 새삼 느끼게 되었습니다. 따라서 현재 프로젝트에서 작성한 쿼리의 실행 계획을 확인 후, 인덱스를 설정하여 조회 성능을 개선할 수 있는 부분이 있는지 확인해보고자 글을 작성하게 되었습니다!어플리케이션 코드.OtherMemberProfileView otherMemberProfileView = queryFactory .from(member) .leftJoin(hobby).on(hobby.id.in(member.profile.hobbyIds)) .leftJoin(job).on(job.id.eq(member.profile.jobId)) .. 2025. 3. 4.