InnoDB는 테이블 기반의 잠금이 아닌 레코드 기반의 잠금을 제공한다. 그때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. PK에 의한 클러스터링 InnoDB의 모든 테이블은 PK 값의 순서대로 클러스터링되어 저장된다. 모든 세컨더리 인덱스는 레코드 주소 대신 PK의 값을 논리적인 주소로 사용한다. 테이블이 PK 순서대로 저장되어 있기 때문에 PK를 이용한 레인지 스캔이 상당히 빠르다. 결과적으로 실행계획에서 PK는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정된다. MVCC(Multi Version Concurrency Control) 잠금을 사용하지 않는 일관된 읽기 제공을 위해 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다. InnoDB는 언두 로그를 이용해 이 기능..
쿼리 캐시 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 캐시 데이터를 반환한다. 하지만 테이블의 데이터가 변경되면 캐시에 저장된 데이터 중 변경 사항과 관련된 것들을 모두 삭제해야한다. 이는 심각학 동시 처리 성능 저하를 유발한다. 결국 MySQL 8.0에서부터 쿼리 캐시 기능은 완전히 제거 되었다. 쿼리 파서 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만든다. 쿼리 문장의 기본 문법 오류를 발견하고 오류 메시지를 전달한다. 전처리기 파싱된 쿼리 문장에서 구조적인 문제점을 확인한다. 각 토큰을 테이블 이름이나 칼럼 이름, 내장 함수와 같은 객체를 매핑한다. 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인한다. 실제 존재하지 않거나 권한상 사용할 수 없는 경우 오류가 발생한다. 옵티마이저 쿼..
MySQL 아키텍처 MySQL 커넥터 다양한 방식으로 다양한 언어에서 SQL을 사용할 수 있도록 도와준다. MySQL C API, JDBC, ODBC, .NET 표준 드라이버 등이 있다. MySQL 엔진 MySQL의 두뇌 역할은 한다. SQL 문장을 분석하거나 최적화한다. 커넥션 핸들러, SQL 파서 및 전처리기, 옵티마이저가 중심을 이룬다. MySQL 스토리지 엔진 MySQL의 손발 역할을 한다. MySQL 엔진이 SQL을 분석하고 실행계획을 작성하면 MySQL 스토리지 엔진은 그것에 맞게 실제 데이터를 디스크 스토리지에 저장하거나 가져온다. 대표적으로 InnoDB와 MyISAM이 있다. 핸들러 API MySQL이 스토리지 엔진에게 읽기 또는 쓰기 요청을 보내는 것을 핸들러 요청이라 한다. 이때 사용되..