개발자
안녕하세요. 이번에 사내시스템을 오픈했는데, 고작 20명 정도가 한 테이블을 조회하는데 테이블이 Lock 걸리면서 사내시스템이 정상적으로 작동을 하지않아 보류하게 됐습니다. 여기서 질문입니다. 다른분들은 저희 회사 규모보다 훨씬 많은 이용자들이 방문하고 조회할것인데 테이블 조회 관리를 어떻게 처리하고 계신가요..? 테이블에 1년치 데이터만 이관을 해도 조회속도가 현저히 느려지고 작업속도가 굉장히 느려집니다.. 쿼리를 Limit과 offset을 사용하여 페이징처리까지 해도 워낙 Group By로 묶인 컬럼들이 많아서 조회가 너무 느려지는데 해결방법이 있을까요… 데이터 로우는 100만건 정도 있습니다 요약 1. 여러사람이 한 테이블을 조회할때 Lock을 어떻게 해결하는지? 2. 데이터가 많을때 어떤 최적화를 해야 처리속도가 빠를지? Gcp 2코어 8기가 사용중
답변 2
락은 해당 테이블에 cud 가 있을때 락이 잡히거나 쿼리가 오래걸리는 경우 (master)에서 replica 이동을 위한 history length 등 다양한 상황이 있을수 있습니다 1. index는 잘 타는가? 2. fetch 의 범위가 너무 큰가 3. transaction 을 걸고 조회시 무거운 쿼리가 도는가 등 다양한 가설을 새우고 하나씩 풀어봐야 할것 같아요
어떤 도구를 사용하시는 지는 잘 모르겠지만 datagrip과 같은 일반적인 db 도구들은 실행계획(execution plan) 기능을 갖고 있습니다. 해당 도구를 통해 전반적인 쿼리 실행에서의 병목을 찾아낼 수 있습니다. Group by의 경우 전체 통계와 같은 값을 실시간 계산하시는 것이라면 풀 스캔을 할 가능성이 많습니다. 위 gpt답변대로 이런경우 통계 결과값을 담는 테이블을 만들고 주기적으로 업데이트 해주거나, materialized view 같은기능을 이용해 group by 된 테이블을 물리 view로 만들어 관리할 수 있습니다. 모든걸 쿼리로 의존하고 있다면 적절히 비즈니스 로직으로 이관하는 것도 고려해야 할 것 같습니다. Slow query알림을 통해 실행이 느린 쿼리를 감지하여 리펙토링하는 것도 방법입니다. 파악이 어렵다면 Cpu, Ram 실행율을 보시고, 어떤 함수, 쿼리실행 시 사용률이 올라가는지 체크해봐도 좋습니다. Jpa와 같은 Orm기술을 사용하신다면 n+1 문제가 발생하고 있진 않은지 체크해보세요. 단순히 한 쿼리 뿐 아니라 한 메서드에서 매우 많은 쿼리를 실행하면서 병목이 발생할 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
1월 13일
MySQL에서 고성능을 달성하려면 여러 가지 주요 포인트를 염두에 두어야 합니다. 1. Lock 문제 해결: 이 부분은 어떻게 lock이 발생하는지에 따라 다릅니다. 테이블 레벨의 잠금인지 아니면 행 레벨의 잠금인지가 중요합니다. InnoDB 스토리지 엔진을 사용하고 있으면, 가능한 경우 row-level locking을 사용하여 lock 경합을 최소화할 수 있습니다. 2. 쿼리 최적화: "Group By"를 많이 사용해야 하는 경우, 필요한 데이터만 저장하는 요약 테이블(summary table)을 생성하는 것이 하나의 방법입니다. 이 요약 테이블은 정기적으로 업데이트될 수 있으며, 이는 복잡한 집계 쿼리의 성능 문제를 완화할 수 있습니다. 3. 인덱싱: 쿼리 성능에 큰 영향을 미치므로 자주 액세스되는 컬럼은 인덱스를 걸어주는 것이 중요합니다. 4. Vertical Partitioning: 다양한 종류의 작업에 유용하게 응용될 수 있다. 여러 테이블로 나누면 (일부 컬럼들만 있는 서브 테이블), 조회 쿼리는 더 작은 양의 데이터를 스캔해야 하므로 성능이 향상될 수 있다. 5. Horizontal Partitioning: 하나의 테이블을 여러 서브 테이블로 나눈다. 각 서브테이블은 전체 행의 일부만 포함한다. 또한, 이외에도 MySQL 공식 문서나 직접적인 코드 최적화를 연구하여 보다 많은 정보를 얻으실 수 있습니다. 주말에 실제 운영환경에서 이런 문제가 발생하면 정말 골치아프실 거 같습니다. 화이팅입니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!