DBMS/MySQL
[Real MySQL] 10장 파티션
파티션 개요 파티션이란? MySQL 서버의 입장에서는 데이터를 별도의 테이블로 분리해서 저장하지만, 사용자 입장에서는 여전히 하나의 테이블로 읽기와 쓰기를 할 수 있게 해주는 솔루션. 일반적으로 DBMS의 파티션은 하나의 서버에서 테이블을 분산하는 것이며, 원격 서버 간에 분산을 지원하는 것은 아니다. 파티션을 사용하는 이유 테이블의 데이터가 많아진다고 해서 무조건 파티션을 적용하는 것이 효율적인 것은 아니다. 하나의 테이블이 너무 커서 인덱스의 크기가 물리적인 메모리보다 훨씬 크거나, 데이터 특성상 주기적인 삭제 작업이 필요한 경우 등이 파티션이 필요한 대표적인 예라고 할 수 있다. 단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리 데이터베이스에서 인덱스는 일반적으로 SELECT를 위한 것으..
InnoDB 개념 정리
InnoDB 개요 클라이언트의 데이터 읽고 쓰기 요청에 대한 응답은 모두 데이터베이스 캐시(버퍼 풀)를 통해 일어나며, 참조 또는 변경하는 데이터가 버퍼 풀에 없으면 데이터베이스에서 해당 데이터를 패치한다. 클라이언트의 요청이 데이터 변경인 경우 데이터의 변경 작업은 모두 버퍼 풀에서 일어나며, 데이터베이스에 바로 쓰지는 않는다. 참고로, 데이터의 정합성을 보증하기 위해서는 데이터베이스보다 로그를 먼저 갱신해야만 한다. 이러한 이유로 일단 COMMIT을 수행한 데이터는 분실하면 안 되므로 COMMIT이 완료되기 까지 로그 버퍼를 통해 변경 내용을 로그에 기록한다. Dirty Data 버퍼 풀에 존재하지만 데이터베이스에는 아직 쓰이지 않는 데이터, 즉 Dirty Data는 백그라운드에서 순차적으로 데이터베..
[Real MySQL] 12장. 쿼리 종류별 잠금 (2) SQL 문장별 잠금
배타적 락 vs 공유 잠금 배타적 락 즉 배타적 락이란 "내가 쓰기를 하는 동안 남들이 쓰지 못하게 하는 잠금" 공유 잠금 즉 공유 잠금이란 "내가 읽는 동안 남들이 내가 읽고 데이터를 변경하거나 삭제하지 못하게 하는 잠금" 참고로 SELECT만을 의미하는 것이 아닌, INSERT, UPDATE , DELETE 문장을 실행할 때도 읽기가 필요하다. SQL 문장별로 사용하는 잠금 - SELECT SELECT 쿼리 InnoDB 테이블에서는 기본 형태의 SELECT 쿼리는 별도의 잠금을 사용하지 않는다. (REPEATABLE-READ 이하 격리 수준에서) 만약 읽어야 할 레코드가 다른 트랜잭션에 의해 변경되거나 삭제되는 중이라면 InnoDB에서 관리하고 있는 데이터의 변경 이력인 언두 로그를 이용해서 레코드를..
[Real MySQL] 12장. 쿼리 종류별 잠금 (1) InnoDB의 기본 잠금 방식
먼저 트랜잭션이란 논리적인 작업셋의 완전성을 보장하기 위한 기능이고, 잠금이란 동시성을 제어하기 위한 기능이라고 할 수 있습니다. 1. InnoDB의 기본 잠금 방식 MySQL에서 일반적으로 사용 가능한 스토리지 엔진 가운데 InnoDB를 제외한 모든 스토리지 엔진은 대부분 테이블 잠금을 지원하고 있기 때문에 각 쿼리가 사용하는 잠금이 복잡하지도 않고 이해하기 어렵지도 않다. 하지만 InnoDB에서는 각 쿼리의 패턴별로 사용하는 잠금이 달라 복잡한 부분이 있기 때문에 주의해야 한다. SELECT REPEATABLE-READ 이하의 격리 수준에서는... InnoDB 테이블에 대한 SELECT 쿼리는 기본적으로 아무런 잠금을 사용하지 않는다. 또한 이미 잠금 레코드를 읽는 것도 아무런 제약이 없다. 만약 읽..
[Real MySQL] 6장(2) 실행 계획 - MySQL의 주요 처리 방식
들어가기 앞서서 MySQL 엔진에서 부가적으로 처리하는 작업은 대부분 성능에 미치는 영향력이 큰데, 안타깝게도 모두 쿼리의 성능을 저하시키는 데 한몫하는 작업이다. 풀 테이블 스캔 실행 조건 MySQL 옵티마이저는 다음과 같은 조건일 때 주로 풀 테이블 스캔을 선택한다. 테이블의 레코드 건수가 너무 작은 경우 (일반적으로 테이블이 페이지 1개로 구성된 경우) WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우 인덱스 레인지 스캔을 사용할 수 있는 쿼리라도, 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우. 리드 어헤드 InnoDB 스토리지 엔진은 특정 테이블의 연속된 데이터 페이지가 읽히면 백그라운드 스레드에 의해 리드 어헤드 작업이 자동으로 시작된다. 리드 어헤드..