본문 바로가기

전체 글

(14)
[아키텍처] 사용자 수에 따라 시스템 설계하기 한 명의 사용자를 지원하는 시스템에서 시작하여 몇 백만 사용자를 지원하는 시스템을 설계하자.단일 서버와 데이터베이스모든 컴포넌트가 단 한 대의 서버에서 실행되는 간단한 시스템을 설계하면 아래 그림과 같다. 웹 앱, 데이터베이스 캐시 등이 전부 서버 한 대에서 실행된다.  사용자가 늘면 서버 하나로는 충분하지 않아서 여러 서버를 두어야 한다. 웹과 모바일 트래픽을 처리하는 서버(웹 계층)와 데이터베이스 서버(데이터 계층)을 분리하면 각각을 독립적으로 확장해 나갈 수 있다.  관계형 데이터베이스는 자료를 테이블과 열, 칼럼으로 표현한다. SQL을 사용하면 여러 테이블에 있는 데이터를 그 관계에 따라 join하여 합칠 수 있다. 반대로 비 관계형 데이터베이스인 NoSQL은 일반적으로 join 연산은 지원하지 ..
[DB] MySQL 엔진 아키텍처 파헤쳐보기 MySQL 전체 구조4MySQL의 전체 구조는 MySQL 엔진, 스토리지 엔진, 핸들러 API으로 나뉜다.MySQL 스레딩 구조MySQL 서버는 프로세스 기반이 아닌 스레드 기반으로 동작한다. MySQL 서버에서 동작하는 스레드는 포그라운드(Foreground) 스레드와 백그라운드(Background) 스레드로 구분된다. 포그라운드(Foreground) 스레드는 최소 MySQL 서버에 접속된 클라이언트의 수만큼 존재한다. 그리고 커넥션 종료 후 스레드 캐시(Thread cache)로 돌아간다. 포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 가져오고 없으면 직접 디스크의 데이터나 인덱스 파일로부터 데이터 읽어오는 역할을 한다. 다만 InnoDB는 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리..
[트러블 슈팅] 인덱스 컨디션 푸시다운, 인덱스를 이용한 정렬, 커버링 인덱스로 슬로우 쿼리 튜닝하기 도입지난 글에서 단건 반복 쿼리를 벌크 SELECT 쿼리로 변경함으로써 n + 1문제를 해결했다. 더 나아가 JMeter로 성능 테스트를 진행하여 얼만큼 성능이 높아졌는지 비교해보았다. 이번 글에서 실행 계획을 분석하고 쿼리를 튜닝한 뒤 다시 JMeter로 성능 테스트를 진행한 경험을 소개한다. 인덱스 생성과 인덱스 컨디션 푸시다운n + 1 문제를 해결한 /api/v1/missions/matching 엔드포인트는 쿼리가 총 3번 전송된다. 아래는 첫 번째로 전송되는 쿼리이다. 미션(missions), 미션 카테고리(m_categories), 지역(regions), 미션 북마크(mission_bookmarks) 총 4개의 테이블을 조인하고 있다. 그리고 미션에 10만개, 미션 카테고리에 8개, 지역에 42..