1. MySQL의 격리수준과 SELECT 구문의 작동 방식 REPEATABLE READ MySQL의 기본 격리 수준은 REPEATBLE-READ입니다. 처음 MySQL을 접하면 다른 REPEATBLE-READ이라는 다른 격리 수준에 흥미를 가지며 알아보게 되는데요. 오늘도 해당 격리 수준에 대해 알아보면서 SELECT ... FOR UPDATE가 동작하는 방식도 함께 알아보겠습니다. 잠금 없는 일관된 읽기: MySQL에서는 잠금 없는 일관된 읽기를 지원합니다. 이는 무슨 뜻일까요?A 세션에서 a 레코드를 읽는데 B 세션이 a 레코드를 변경하면? 일부는 변경된 데이터, 일부는 변경 전 데이터를 가져올 수 있지 않을까요? 그럴 때 shared lock을 걸면 물론 변경되는 걸 방지할 수 있습니다. 하지만 ..
2. 정의 및 동작 방식 Lateral Derived Table이란?LATERAL은 MySQL 8.0.14버전에 새롭게 추가된 키워드인데요. LATERAL키워드를 선언한 Lateral Derived Table은 동일한 FROM절에 있는 선행 테이블의 컬럼값을 참조할 수 있습니다.. Derived Table(파생 테이블)은 쿼리의 FROM 절에서 서브쿼리를 통해 생성되는 임시 테이블을 의미합니다.일반적으로 Derived Table은 선행테이블의 컬럼을 참조할 수 없으나, Lateral Derived Table은 참조가 가능합니다.정의된 Dervied Table 앞부분에 LATERAL 키워드를 추가해서 사용할 수 있습니다.참조한 값을 바탕으로 동적으로 결과 생성합니다. 동작 방식SELECT e.emp_no,..
1. MySQL Function MySQL Function이란 부르면 특정 동작을 해주거나 결과값을 주는 것입니다. 보편적인 프로그래밍 언어면은 대부분 존재하는데 MySQL도 함수를 선언할 수 있습니다.종류는 크게 세가지로 나뉩니다.Built-in FunctionUser-Defined FunctionStored Function오늘은 이 함수들이 가질 수 있는 특성인 DETERMINSTIC (확정적) vs NOT DETERMINISTIC과 그에 따른 인덱싱에 대해 알아보고자 합니다.2. DETERMINSTIC vs NOT DETERMINISTICMySQL의 함수는 위 두 특성 중 한 가지 특성을 가지게 됩니다. 두 특성의 차이는 무엇일까요?동일 상태와 동일 입력으로 호출 → 동일한 결과 반환한다. -> D..
1. 들어가며실무에서 COUNT 쿼리를 사용할 일은 생각보다 자주 있습니다. 다만 COUNT 쿼리가 가볍다는 일반적인 인식이 있어서, 잘못된 쿼리로 예상치 못한 성능 이슈를 겪는 경우도 있습니다. 오늘은 COUNT 쿼리의 잘못된 인식을 짚고, 튜닝하는 방법에 대해 정리하고자 합니다. 2. COUNT 쿼리에 대한 잘못된 인식일반적으로 COUNT(*) 쿼리는 빠를 것으로 기대합니다.그럼 다음의 두 쿼리는 어떤 것이 빠를까요?SELECT COUNT(*)WHERE ix_fd = 'A' AND non_ix_fd = 'B';SELECT *WHERE ix_fd = 'A' AND non_ix_fd = 'B'; 위 쿼리는 인덱스 사용 가능하지만 커버링 인덱스 실행 조건은 불가능합니다.따라서 ix_fd의 index로 대..
1. 들어가며 이상적으로 데이터베이스 스키마를 설계할 때에는 논리 모델링 (업무 전문가)업무 분석엔티티 & 속성 & 관계 도출정규화물리 모델링 (DBMS 전문가)DBMS 벤더 별 최적 컬럼 타입 선정접근 패턴 분석반 정규화인덱스 전략 수립와 같은 구조로 이루어진다고 합니다. 하지만 소규모 프로젝트는 논리 모델링과 물리 모델링을 함께 하는 편이 많고, 회사 크기가 작은 경우 DBA가 따로 없는 경우도 있습니다. 저도 현재 직접 데이터베이스 스키마를 설계하고 그걸 물리 모델링에 mapping을 하면서 여러 선택지에 놓이게 되는 경우가 많은데요. 그러면서 MySQL 지식에 대해 한계를 느낀 적이 있습니다. 그래서 저번에 읽은 Real MySQL을 다시 펼치고, inflearn의 저자 강의를 찾아 들으면서 더 ..
1. 들어가며 앞서 저희는 로그 추적기라는 부가 기능을 기존 프로젝트에 추가하면서 생길 수 있는 문제점과, 그에 대한 해결책에 대해 알아보았습니다. 간단하게 그 과정을 복습해볼까요? 프로젝트 전반의 코드에 모두 적용되어야 하지만, 핵심적인 비즈니스 로직이 아닌 '부가 기능'이다.그래서 기존 코드에 영향을 주지 않고 적용될 수 있으면 좋겠다.그래서 템플릿 메서드 패턴 -> 전략 패턴 -> 프록시 패턴 -> 동적 프록시 및 CGLIB 적용라는 과정을 통해서 기존 코드를 바꾸지 않고, 프록시 클래스도 자동생성을 맡기면서 코드 양도 훨씬 줄일 수 있었습니다.저희가 구현한 기능들은 사실 Spring에서 구현해서 제공하고 있습니다. 그것이 AOP이고, 오늘은 Spring에서 AOP를 어떤 방식으로 제공하고 있는지 ..