본문 바로가기

DB

(2) Mysql 실행 계획 분석 및 쿼리 튜닝 1. 서론2. 쿼리 응답 속도3. 부하 테스트4. 실행 계획 분석5. 쿼리 튜닝6. Spring에서 쿼리 힌트7. 결과8. 결론과 마무리 1. 서론지난 글에서 QueryDsl을 사용하여 DTO 조회로 극한의 성능 최적화를 진행했었습니다. 그때 결과적으로 약 6배 이상의 성능이 개선되었는데,데이터를 가져오는 양과 트랜잭션 범위의 차이에 의한 것이라고 생각했었습니다. 하지만 김영한님의 강의에서 요즘은 네트워크 성능이 좋아졌기 때문에 성능상 크게 차이가 나지 않을 것이라 하였고, 그렇다면 트랜잭션의 범위 차이와 user_roles 쿼리 한번의 추가로 6배나 차이가 생길까? 하는 의문이 계속 들었습니다. 그래서 테스트 했던 것을 다시 회고하는 중에, 엔티티로 모두 조회하는 쿼리에 포함되어 있던 distinct가.. 더보기
(2) 스프링 Redisson 분산락 진행 중인 프로젝트는 여러 개의 서버가 nginx로 로드밸런싱 되고 있고, DB는 Master-Slave 구조로 이중화되어 있다. 이런 환경에서는 어떤 락을 사용해서 동시성 문제를 해결해야 할까 ? 목차 1. 분산락이란 2. 다른 방식의 락은 동시성 문제를 해결할 수 없나 ? 3. Redisson vs Lettuce 4. AOP를 이용한 분산락 5. 낙관적 락, 비관적 락, 분산 락 테스트 6. 결론 1. 분산락이란 분산락은 여러 서버 또는 DB에서 공유되는 데이터의 동시성 문제를 해결하기 위해 사용하는 기술이다. lock을 획득한 프로세스 or 스레드가 공유되는 데이터 or critical section에 접근할 수 있도록 하여 race condition을 방지한다. 2. 다른 방식의 락은 동시성 문제.. 더보기
(1) 스프링 동시성 문제 1. 서론 나의 프로젝트들 중에는 '조회수'와 '북마크 수'를 카운트하는 기능이 있다. 조회수가 증가하는 로직은 중복을 방지하여 사용자가 게시글을 조회하면 조회수에 + 1 갱신 북마크 수는 DB 테이블을 반정규화하여 Board 테이블의 컬럼에 북마크 수를 두고, 사용자가 게시글을 북마크하거나 해제하면 +1, -1 하도록 구현했다. 얼마전 유튜브를 보다가 실제 인스타그램에서도 좋아요 수를 표시하기 위해 이렇게 테이블을 구성했다고 한다. 나의 기능들을 보면, 조회수나 북마크 수는 비즈니스에 엄청난 영향을 미치는 것은 아니기에 무시할 수도 있다. 하지만 상품의 재고 수량과 계좌의 입출금 같은 경우 동시성 문제가 일어난다면 비즈니스에 치명적인 피해를 입힐 것이다. 2. 동시성 문제가 뭔데 ? 하나의 자원을 2개.. 더보기
DB Replication / Master-Slave 이중화 with Spring 목차 1. Master-Slave 구조란 ? 2. DB Replication으로 Master-Slave 구조를 사용할 때 장점과 단점 3. 스프링에서 설정하기 1. Master-Slave 구조란 ? DB 시스템에서 사용되는 복제(Replication) 형태이다. Master DB에서는 주로 쓰기 작업을 처리하고, Slave DB에서 읽기 작업들을 처리하여 부하를 분산하고 가용성을 높일 수 있다. 하지만 이렇게 작업을 나누면 DB들 간의 데이터 정합성 문제가 생길 수 있다. 데이터를 동기화 시키기 위해 MySQL에서는 기본적으로 비동기 복제 방식을 사용하고 있다. Master DB에서 쓰기, 삭제, 수정 작업이 일어나서 변경이 생기면, 이를 비동기적으로 Binary Log에 기록하고 Master Threa.. 더보기
auto_increment index 꼭 필요한가 ? 의문점프로젝트를 진행하면서 게시글에는 해시태그를 넣을 수 있다.인스타그램처럼 내가 원하는 해시태그를 마음대로 넣을 수 있는 건 아니고 정해진 해시태그들을 선택할 수 있도록 했는데, 여기서 데이터베이스의 인덱스에 의문점을 가지게 됐다. 해시태그는 다음과 같이 사용된다.해시 태그를 이용해서 게시글을 검색(조회)할 때어떤 게시글에 달린 해시 태그를 조회할 때 (어떤 게시글을 조회하면, 그 게시글에 달린 해시 태그들도 같이 가져와야 함)게시글을 작성할 때 (게시글에 해시 태그를 넣음) 내가 궁금했던 것은 테이블의 클러스터 인덱스인 board_hashtag_id가 필요할까? 였다. 해시태그가 사용될 때의 쿼리는 다음과 같다.where hashtag_name = ?where board_id = ?insert ,,,.. 더보기