목록전체 글 (286)
빙응의 공부 블로그

📝8.4 R-Tree 인덱스아마도 MySQL의 공간 인덱스라는 말을 한 번쯤은 들어본 적이 있을 것이다. 공간 인덱스는 R-Tree 인덱스 알고리즘을 이용한 2차원 데이터를 인덱싱하고 검색하는 목적의 인덱스이다. 기본 내부 메커니즘은 B-Tree와 흡사하다. 그러나 R-Tree는 칼럼의 값이 2차원의 공간 개념 값이다. 그렇다면 왜 쓰는 것일까?최근 GPS나 지도 서비스를 내장하는 스마트 폰이 대중화되면서 GIS와 GPS 기반의 서비스가 많아졌다. 이러한 위치 기반의 서비스를 구현하는 방법은 여러 가지가 있겠지만 MySQL의 공간 확장을 이용하면 간단하게 구현 가능하다. 아래는 공간확장의 기능이다.공간 데이터를 저장하는 데이터 타입 지원공간 데이터 검색을 위한 공간 인덱스공간 데이터의 연산 함수 ?..

인덱스는 데이터베이스 쿼리의 성능을 언급하면서 빼놓을 수 없는 부분입니다. 이번 장에서는 MySQL 쿼리의 개발이나 튜닝을 설명하기 전에 인덱스의 종류와 특성을 알아보겠습니다. 📝8.1 디스크 읽기 방식인데스에서만 사용하는 용어는 아니지만 이번 장에서는 랜덤 I/O와 순차 I/O 같은 디스크 일기 방식부터 알아봅시다. 컴퓨터의 CPU나 메모리처럼 전기적 특성을 지닌 장치는 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했습니다. 데이터베이스나 쿼리 튜닝에 어느 정도 지식을 갖춘 사용자가 절감하고 있듯이 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건입니다. 🧷8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD)컴퓨터에서 C..

이번 장에서는 MySQL 동시성에 영향을 미치는 잠금, 트랜잭션, 트랜잭션 격리 수준에 대해 알아보겠습니다. 트랜잭션은 작업의 완전성을 보장해주는 것으로 논리적인 작업을 모두 완벽하게 처리하거나 모두 적용 안되게 만들어 주는 기능입니다. 잠금과 트랜잭션은 서로 비슷한 개념 같지만 사실 잠금은 동시성 제어를 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하는 기능입니다. 하나의 회원 정보 레코드를 여러 커넥션에서 동시에 변경하려고 하는데 잠금이 없다면 하나의 데이터를 여러 커넥션이 동시에 변경하게 됩니다. 결과적으로 해당 레코드의 값을 예측할 수 없는 상태가 되기 때문에 순서대로 한 시점에 하나씩 변경하는 역할을 합니다. 격리 수준이라는 것은 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어..

📝4.2 InnoDB 스토리지 엔진 아키텍처MySQL의 스토리지 엔진 가운데 가장 많이 사용하는 InnoDB 스토리지 엔진에 대해 살펴봅시다. InnoDB 스토리지 엔진은 MySQL 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며, 그 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어납니다. 🧷4.2.1 프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준을 클러스터링되어 저장됩니다.즉, PK를 기준으로 순서대로 디스크에 저장된다는 뜻입니다. 모든 세컨더리 인덱스(클러스터링 인덱스 제외 모든 인덱스)는레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용합니다. 그렇기에 테이블에는 기본적인 기본키 인덱스가 존재하여 범위 스캔에 대..

이번 장은 MyISAM은 제외합니다.📝4.1 MySQL 엔진 아키텍처MySQL 서버는 다른 DBMS에 비해 구조가 상당히 독특합니다.사용자 입장에서는 거의 차이가 없지만 이러한 독특한 구조 때문에 엄청난 기능을 누릴 수 있어요.반대로 다른 DBMS에서 발생하지 않는 문제도 생깁니다. 🧷4.1.1 MySQL 전체 구조 MySQL은 일반 RDBMS와 같이 대부분의 프로그래밍 언어를 모두 지원합니다. MySQL은 크게 MySQL 엔진과 스토리지 엔진으로 구분이 가능합니다.책에서는 이렇게 구분한 이유를 MySQL의 쿼리 파서와 옵티마이저 등과 같은 기능을 스토리지 엔진과 구분해서 설명하기 위해서 한 것입니다. 그렇기에 이 둘을 합친 것 자체가 사실상 MySQL 서버입니다. 📌 4.1.1.1 MySQL 엔진..

📝 스프링 트랜잭션 전파 속성 트랜잭션 전파 속성은트랜잭션이 진행중일 때 추가 트랜잭션 진행을 어떻게 하는지 결정하는 것입니다. 그렇다면 트랜잭션 전파 속성을 어떨 때 사용하는 것일까요? 아래 코드처럼 propagation을 통해서 설정할 수 있습니다. @Transactional public void acceptRequest(Long fromMemberId, Long toMemberId) @Transactional(propagation = Propagation.REQUIRES_NEW) public void acceptRequest(Long fromMemberId, Long toMemberId) 트랜잭션 전파 속성은 다른 메소드나 서비스 호출 시, 트랜잭션을 어떻게 다룰지..