[MySQL] MySQL에서의 트랜잭션과 잠금 분석
·
Backend/DB
동시성에 대한 처리를 위한 잠금과, 데이터 정합성을 위한 트랜잭션을 MySQL에서는 어떻게 다루고 있는지 분석합니다.MySQL 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아닙니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있는 관계없이 논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장해 주는 것입니다. 다음은 이에 대한 예시를 MyISAM과 InnoDB의 쿼리 동작 차이로 풀어낸 것입니다.INSERT INTO tab_myisam (fdpk) VALUES (3);INSERT INTO tab_innodb (fdpk) VALUES (3);SET autocommit=ON;INSERT IN..
[MySQL] InnoDB 스토리지 엔진 아키텍처 분석
·
Backend/DB
InnoDB 아키텍처클러스터링 기본적으로 InnoDB의 모든 테이블은 PK를 기준으로 순서대로 클러스터링되어 저장됩니다. 또한 모든 세컨더리 인덱스는 레코드의 주소 대신 PK 값을 논리적인 주소로 사용(물리적인 주소가 아니라, 세컨더리 인덱스가 PK 값을 가리키는 포인터로 구성됨)합니다. 이러한 특징 때문에 PK를 이용한 스캔이 상당히 빨라서, 기본적으로 다른 보조 인덱스에 비해 PK가 쿼리 실행 계획에서 비중이 높게 설정됩니다.외래키 지원 MyISAM이나 MEMORY 테이블에서는 지원하지 않습니다. InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 칼럼에 인덱스 생성이 필요하고 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요합니다. 특히 데이터가..
[MySQL] MySQL 엔진 아키텍처 분석
·
Backend/DB
MySQL의 전체 구조 MySQL은 일반 상용 RDBMS와 같이 대부분의 프로그래밍 언어로부터 접근 방법을 모두 지원합니다. 이는 MySQL 고유의 C API로부터 시작해서 JDBC나 ODBC, 그리고 .NET의 표준 드라이버를 제공해서 이를 바탕으로 거의 모든 언어로 MySQL 서버에서 쿼리를 사용할 수 있습니다.MySQL 엔진 MySQL 엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룹니다.커넥션 핸들러클라이언트의 접속 요청 (TCP) 수락사용자 인증, 권한 확인연결마다 전담 스레드를 할당, 연결 종료 처리클라이언트가 보내는 쿼리를 MySQL 내부로 전달, 해당 쿼리의 결과나 에러를 클라이언트에게..
[Test] 점진적 부하테스트: 1,000,000명 유저의 알림 전송 요청 - 스레드
·
Test
이전 포스트에 이어서 알림 전송 요청 시나리오를 계속해서 진행합니다.https://soberyl.tistory.com/38 [Test] 점진적 부하테스트: 10,000명 유저의 알림 전송 요청 - JPA현재 진행 중인 프로젝트 알림 로직의 특징 지금 구현되어 있는 알림은 한 메인 기능의 주도적인 로직이 포함된 상태가 아니라, 상품 주문이 끝나면 상품 주문 완료 알림을 보내는 등의 보조적soberyl.tistory.com이전까지는 만명의 SSE 유저의 알림 전송 요청을 완료했었고, 이제는 100만명으로 늘려서 커버해보려고 합니다.시나리오 1: 100,000명 유저 알림 전송 요청테스트 결과 상정했던 threshold를 넘기는 했으나 그렇게 까지 큰 차이는 아니었습니다. 개선을 통해서 얻는 효과를 좀 ..