본문 바로가기

Database7

[MySQL] B-Tree 인덱스 디스크 읽기 방식랜덤 I/O와 순차 I/O랜덤 IO와 순차 IO 모두 하드 디스크 드라이브의 플래터를 돌려 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것은 동일합니다.그러나 순차 IO가 3개의 페이지를 디스크에 기록하기 위해 1번의 시스템 콜을 호출한다면, 랜덤 IO는 3번의 시스템 콜을 호출합니다. 즉, 디스크 헤드를 3번 움직이며 3배의 속도 차이가 발생합니다.쿼리를 튜닝해서 랜덤 IO를 순차 IO로 바꾸는 방법은 많지 않습니다. 쿼리 튜닝의 목적은 랜덤 IO 자체를 줄이는 것이며 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미합니다.인덱스란인덱스란 컬럼의 값과 해당 레코드가 저장된 주소를 키-값 쌍으로 만들어 둔 것을 의미합니다. 컬럼의 값을 기준으로 정렬해서 보관하기 .. 2024. 6. 18.
[MySQL] InnoDB 스토리지 엔진 아키텍처 InnoDB 스토리지 엔진 아키텍처프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링되어 저장됩니다. 따라서 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다.쿼리의 실행 계획에서 클러스터링 된 프라이머리 키는 기본적으로 세컨더리 인덱스에 비해 비중이 높게 설정됩니다.외래 키 지원InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 컬럼에 인덱스 생성이 필요하고, 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요하므로 잠금이 여러 테이블로 전파됩니다. 그로 인해 데드락이 발생할 때가 많으므로 개발할 때도 외래 키의 존재에 주의해야 합니다.외래 키가 복잡하게 얽혀있는 경우 데.. 2024. 6. 9.
[MySQL] MySQL 엔진 아키텍처 MySQL 스레딩 구조MySQL 서버는 스레드 기반으로 작동하며, 포그라운드(Foreground)와 백그라운드(Background) 스레드로 구분할 수 있습니다.포그라운드 스레드(클라이언트 스레드)포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며, 각 클라이언트가 요청하는 쿼리 문장을 처리합니다. 클라이언트가 작업을 마치고 커넥션을 종료하면 스레드는 스레드 캐시(Thread cache)로 돌아갑니다.스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드를 종료시켜 일정 개수의 스레드만 유지합니다. 스레드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수로 결정합니다.포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로.. 2024. 6. 9.
[MySQL] 옵티마이저의 데이터 처리 방식 MySQL은 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어 있는지 통계 정보를 참조합니다. 그러한 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업이 필요합니다.쿼리 실행 절차MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계로 나누어질 수 있습니다.사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이애할 수 있는 수준으로 분리(파스 트리)한다.SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.이 중 두 번째 단계가 "최적화 및 실행 계획 수립" 단계로 옵티마이저가 처리합니다. 이 단.. 2024. 5. 15.
MySQL, Spring 프로젝트 연동시 예약어 문제 언젠가는 상위 버전으로 업그레이드할 수 있으므로 향후 예약어도 살펴보는 것이 좋습니다. 이러한 단어는 상위 버전의 MySQL을 다루는 설명서에서 찾을 수 있습니다. (MySQL 공식 문서 9.3 Keywords and Reserved Words 중)(DeppL 번역) 일반적으로 group 이라는 이름은 대표적인 예약어 중 하나이다. 때문에 JPA를 배울때도 예제 프로젝트에서 @Table(name = "groups") 라는 애노테이션은 항상 따라다녔다. 이번 프로젝트에도 Group 이라는 엔티티가 포함되어 있어 @Table(name = "groups") 애노테이션을 통해서 테이블 이름에 예약어를 사용하지 않도록 하였고, H2 내장 DB에서도 잘 작동되는 것을 확인하였다. Caused by: java.sql.. 2023. 4. 12.
정규화란 무엇인가 본 내용은 한빛미디어의 데이터베이스 개론(3판)을 읽고 정리한 내용입니다. 속성(attribute)들 간의 종속성(dependency)을 분석해서 하나의 종속성이 하나의 릴레이션(relation)으로 표현되도록 분해해 나가는 과정을 정규화라 한다. 기본 원칙은 다음 3가지이다. 정보의 무손실 분해된 릴레이션이 표현하는 정보는 분해되기 전의 정보를 모두 포함하여야 하며, 더 바람직한 구조여야 한다. 분해된 릴레이션은 조인을 통하여 언제든 원래 릴레이션의 모습으로 복원할 수 있어야 한다. 중복성 감소 중복으로 인한 이상 현상을 제거한다. 테이블의 분리 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리하여 표현해야 한다. 정규형은 기본 정규형과 고급 정규형으로 나뉜다. 일반적으로는 기본 정규형인 1차 정.. 2023. 3. 22.