CS
-
9장 - 옵티마이저와 힌트 - 2편CS/Real MySQL 8.0 요약 2023. 12. 23. 00:01
고급 최적화 옵티마이저가 실행계획을 수립할 때 통계 정보와 옵티마이저 옵션을 결합하여 최적의 실행 계획을 수립합니다. 기본적으로 deafult 값이 제공되며 on, off를 통해 옵션을 활성화, 비활성화할 수 있습니다. 이 옵션은 MySQL 서버 전체(Global) 또는 현재 커넥션(Session)에만 적용할 수 있습니다. Multi-Range Read(MRR) 보통 조인을 수행하면 드라이빙 테이블(조인에서 먼저 읽는 테이블)의 레코드를 한 건 읽어서 드리븐 테이블(조인되는 테이블들에서 드라이빙 테이블이 아닌 테이블들)의 일치하는 레코드를 찾아서 조인을 수행합니다. 이런 방식은 Nested Loop Join이라고 합니다. 조인 처리는 MySQL 엔진이, 실제 레코드를 검색하고 읽는 부분은 스토리지 엔진이..
-
Outer Join 주의사항CS/데이터베이스 2023. 12. 6. 00:01
개요 bigQuery를 활용하여 두 테이블을 join 하다가 내 예상과 다른 결과가 나와서 당황했는데 근본적인 원인을 찾아 해결한 내용을 적어보고자 합니다. 시도했던 쿼리 -- 예상한대로 결과가 나오지 않는 쿼리 select * from `myTable1` as C LEFT OUTER JOIN `myTable2`as B on C.user_id = B.user_id WHERE C.partition_dates = '2023-11-20' AND C.탈퇴가_되지_않았으면_None인_필드 = 'None' AND B.user_id is null AND B.partition_dates = '2023-11-20'; B테이블과 C테이블을 비교하여 데이터 정합성을 맞추는 과정을 수행하고 있었습니다. 이때 LEFT OUTE..
-
9장 - 옵티마이저와 힌트 - 1편CS/Real MySQL 8.0 요약 2023. 11. 29. 00:01
옵티마이저란? Optimize란 최대로 활용하다, 최적화하다는 뜻을 가진 영단어입니다. DB에 조회하는 쿼리의 결과는 동일하지만 내부적으로 그 결과를 만들어내는 방법은 다양합니다. 최소한의 비용을 드는방법으로 결과를 만들어내야 하는데 옵티마이저가 이 기능을 담당합니다. 옵티마이저의 종류로는 비용기반최적화, 규칙기반최적화기법이 있는데 대부분의 RDBMS가 비용기반최적화 방식을 활용하며 MySQL도 마찬가지입니다. 실행계획 확인하기 실행계획은 옵티마이저가 결과를 만들어내기 위한 방법을 사용자가 확인할 수 있는 방법입니다. 실행계획은 EXPLAIN이라는 명령으로 확인할 수 있습니다. 실행계획을 알아야 하는이유? 실행계획을 분석할 수 있어야 불합리한 부분을 찾아내고, 더 최적화된 방법으로 실행 계획을 수립하도록..
-
8장 - 인덱스CS/Real MySQL 8.0 요약 2023. 11. 13. 00:01
디스크 읽기 방식 순차 I/O - 3개의 페이지를 기록하기 위해 1번의 시스템 콜(OS) 랜덤 I/O - 3개의 페이지를 기록하기 위해 3번의 시스템 콜(OS) 데이터베이스의 성능 튜닝은 랜덤 I/O를 줄이는 것입니다. 랜덤 I/O를 줄인다는 것은 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것입니다. 인덱스란? 책의 색인에 비유되며 책의 내용은 데이터 파일에 해당됩니다. 책에서 "ㄱ", "ㄴ", "ㄷ" 형태로 정렬되어 있는 것처럼 인덱스로 키가 정렬되어 있습니다. 정렬되어 있기 때문에 저장을 수행할 때 성능을 희생되고 읽기를 수행할 때 성능이 좋습니다. 따라서 모든 칼럼에 인덱스를 거는 건 역효과를 낼 수 있습니다. 인덱스는 PK인지 아닌지에 따라 프라이머리 키와 세컨더리 키로 구분할 수 있습니다. 저장..
-
CQRS 패턴이란?CS/데이터베이스 2023. 11. 9. 00:01
개요CQRS 패턴이란? 왜 CQRS를 사용하는가? CQRS의 구현방법 CQRS와 Event Driven Architecture CQRS 고려사항 CQRS패턴이란?명령(Command)과 질의(Query)의 책임(Responsebilitiy)을 분리(Segregation)한다 라는 뜻의 약자입니다. 쓰기를 위한 데이터 모델(Write Model)과 읽기를 위한 데이터 모델(Read Model)을 분리하는 패턴입니다.보통 쓰기 모델에는 높은 데이터 정합성이 요구되며 정규화된 테이블을 설계하게 되는 경우가 많습니다. Command와 Query를 간단하게 설명할 수 있습니다.Command = 시스템의 상태를 변경하는 작업Query = 시스템의 상태를 조회하는 작업 왜 CQRS를 사용하는가?데이터를 쓰는 빈도보다 ..
-
Deferred Join이란? - 실습편CS/데이터베이스 2023. 11. 1. 00:01
개요 Deferred Join이란?-이론 편에 이어 직접 데이터를 세팅하고 성능이 얼마나 개선되는지 확인하는 실습을 진행해보고자 합니다. Spring Boot를 활용한 50만건의 데이터 세팅 @Component class SettingData( private val memberJpaRepository: MemberJpaRepository, ): ApplicationRunner{ override fun run(args: ApplicationArguments) { repeat(500_000){ memberJpaRepository.save(MemberEntity(name = "test$it")) } } } 어떤 방식으로 데이터를 적재하던 상관없습니다. 쿼리문에 따른 실행계획과 성능을 살펴보기 위해 50만 건의..
-
Deferred Join이란? - 이론편CS/데이터베이스 2023. 10. 28. 00:01
Deferred Join을 활용하면 쿼리 속도를 2배 이상 높일 수 있다고 합니다. Deffered Join이란? deferred는 지연된 연기된 이라는 사전적 의미를 가집니다. pagination을 수행할 때 전체 테이블이 아닌 데이터의 하위 집합에서 pagination을 수행합니다. 이 집합은 subquery에 의해 생성되며 나중에 원래 테이블과 join 됩니다. pagination이 될 때 까지 join 작업이 연기되기 때문에 deffered join이라 불립니다. 전통적인 Pagination SELECT * FROM people ORDER BY birthday, id LIMIT 20 OFFSET 450000; people이라는 테이블이 존재하고 생일, ID별로 정렬된 결과를 표기하고 싶습니다. 이..
-
5장 - 트랜잭션과 잠금CS/Real MySQL 8.0 요약 2023. 10. 26. 00:01
트랜잭션이란? 데이터 정합성을 보장하기 위해 논리적인 작업을 묶어 일부만 적용되는 현상을 발생하지 않도록 만들어주는 기능이다. 잠금이란? 잠금과 트랜잭션은 비슷한 개념 같지만 잠금은 동시성을 제어하기 위한 기능이다. 하나의 데이터를 여러 커넥션이 동시에 변경하지 못하게 막는 역할을 수행한다. 격리 수준이란? 하나의 트랜잭션 내에서 또는 여러 트랜잭션 강의 작업 내용을 어떻게 공유하고 차단할지 결정하는 레벨을 의미한다. MySQL에서 트랜잭션 MyISAM이나 Memory 스토리지 엔진은 트랜잭션을 지원하지 않고 InnoDB부터 트랜잭션을 지원한다. MyISAM의 경우에는 Partial Update가 발생하여 데이터 정합을 맞추기 까다롭다. 트랜잭션의 범위는 최소화해야 커넥션풀을 점유하는 시간이 줄어들고 부..