# InnoDB

[SQL] InnoDB Architecture
InnoDB Architecture > - #### Mysql은 스토리지 엔진이라 불리는 플러그 인 방식으로 데이터베이스를 관리 그 중 가장 많이 사용되는 엔진이 Mysql8.0버전 이상부터는 InnoDB엔진을 가장 많이 사용 InnoDB 구조 InnoDB는 IN-memory구조로, 데이터와 인덱스를 캐싱하기 위한 Buffer Pool이라는 저장 영역을 유지 및 관리 주요 구성요소는 총 4가지 Buffer Pool Change Buffer Adaptive Hash Index Log Buffer Buffer Pool 
트랜잭션과 ACID 그리고 MySQL InnoDB에서 Phantom Read
트랜잭션 하나의 논리적인 작업 단위 ACID 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질 Atomicity (원자성) 트랜잭션 내에서 모든 연산은 전부 실행되거나, 실행되지 않아야 한다. All or Nothing Consistency (일관성) 트랜잭션을 통해 데이터가 변해도, 데이터베이스의 일관성을 유지해야 한다. 제약조건을 위반하면 안된다. (ex: not null, unique) Isolation (격리성) 동시에 여러 트랜잭션이 실행될 경우, 서로 영향을 미치면 안된다. 격리성은 격리 수준을 통해 설정할 수 있다. Durability (지속성) 트랜잭션이 성공적으로 수행되면, 그 결과는 반영되어야 한다. 시스템에 문제가 발생해도 로그 등을 사용하여 성공한 트랜잭션의 내용을 복구할 수 있어야 한다. 트랜잭션의 격리 수준 트랜잭션이 동시에 변경을 수행하고 쿼리를 수행할 때

[Real MySQL 4장] 아키텍처
MySQL 아키텍처 image 프로그래밍 API를 통해 MySQL에 요청을 보낸다. MySQL은 요청 받은 쿼리를 분석해서 최적의 실행계획을 수립 및 스토리지 엔진에게 명령한다. 받은 명령대로 스토리지 엔진이 디스크에 접근하여 데이터를 입출력한다. 쿼리 실행 구조 image 쿼리 파서 요청으로 들어온 쿼리를 MySQL이 인식할 수 있는 최소 단위인 토큰으로 분리해 트리 형태의 구조로 만드는 역할을 한다. 쿼리 문장의 기본 문법 오류는 여기서 발견된다. 전처리기
InnoDB의 Lock 종류
트랜잭션 동시성 제어에 대해서 공부를 하는데 lock과 관련해서 많은 얘기가 나왔다. 생각보다 기본 개념이 안잡힌 부분들이 있는거 같아 이번 기회에 정리를 한 번 하고자 한다. 1. Shared and Exclusive Locks(sLocks and xLocks) InnoDB는 두 가지 유형의 row-level locking을 수행한다. shared Lock row를 조회하는데 필요한 lock Exclusive Lock row를 update/delete하는데 필요한 lock 시나리오 트랜잭션 T1, T2가 있을 때, T1이 특정 row를 read하기 위해 sLock를 가져갔다고 가정하자. T2가 같은 row에 대해서 read하기 위해 sLock 가져갈 수 있다. 하지만 T2가 같은 row에 대해서 update/delete하기 위해 xLock를 가져갈 순 없다. 이번엔 T1이 특정 row를 updat
[Database] MVCC와 InnoDB기반의 MySQL
저번 글([JPA] @Transactional과 synchronized를 동시에 사용할 때의 DB 동기화 이슈)에 이어 이번엔 왜 멀티 쓰레드 환경에서 하나의 트랜잭션에서 하나의 row 데이터에 접근하여 데이터를 변경하는 쿼리를 날리고(flush), 다른 트랜잭션에서 같은 데이터 row에 접근했을 때 변경되지 않은 데이터 값을 가져오는지 알아보기 위해 MVCC에 대해 알아보고 MySQL이 어떻게 동시성 제어를 하는지 보도록 한다. MVCC? Multi Version Control Concurrency의 약자로 다중 버전 동시성 제어라고 한다. Locking의 성능 문제 때문에 탄생하게 되었다. Lock을 사용하지 않고 일관된 읽기를 제공하는 것이 주 목적이다. 사용자는 MVCC에서 데이터
mysql 기본 명령어
show databases; -> 데이터베이스 목록 조회 show tables; -> 해당 데이터베이스의 테이블 리스트 조회 select user, host from user; -> 데이터베이스 선택 후 해당 데이터베이스에 생성되어있는 사용자 조회 grant all privileges on DB명.테이블명 to '계정이름'@'host주소'; -> 해당 DB.TABLE에 모든 권한(select, insert, update, delete) 부여 grant all privileges on DB명.테이블명 to '계정이름'@'host명' identified by 'USER_PASSWORD'; -> 권한 부여와 함께 사용자 생성 update user set password=PASSWORD('변경할 비번') where user='계정이름'; -> 비번 변경 delete from user where user='사용자명'; flush privileges; -> 사용
MyISAM, InnoDB
MyISAM, InnoDB mySQL을 써봤다면 위의 단어들을 들어봤을 것이다. 둘 다 mySQL의 Storage Engine이며, 아마 가장 흔하게 사용되는 것들일 것이다. 두 디비의 특징은 다음과 같다. MyISAM MyISAM 스토리지 엔진은 다음과 같은 특징을 갖는다. mySql의 5.5 버전 이전에는 기본 스토리지 엔진이었다. InnoDB에 비해서 상대적으로 가볍다. Table Level Locking 으로 인해 Insert, Update, Delete 시에 Table 전체에 Lock이 걸린다. (row가 많아질 수록 처리 능력은 떨어진다..) Table과 Index를 별도의 파일로 저장한다. 검색(Select) 작업 처리 능력이 아주 좋다. 풀 텍스트 인덱스를 지원한다. 검색 엔진과 유사한 방법으로 자연 언어를 이용해 검색할 수 있는 특별한 인덱스로 모든 데이터 문자열의 단어를 저장한다. MyISAM 스토리지 엔진은

[Real MySQL] 04. InnoDB Buffer Pool과 내부 LRU 알고리즘 살펴보기
이 포스팅은 Real MySQL의 04장을 읽고 개인적으로 학습하고 이해한 내용입니다. 틀린 부분이 있다면 언제든 지적 부탁드립니다. Buffer Pool이란? 버퍼와 캐시 혹은 디스크에서 데이터를 읽거나 쓰는 역할을 하는 MySQL 대표 스토리지 엔진 InnoDB에서는 자주 사용되는 데이터를 메모리에 적재하여 빠르게 접근함으로써 전체적인 작업 속도를 향상시킬 수 있는데요. 이 메모리를 버퍼풀이라고 합니다. 이렇게 성능 향상에 긍정적인 영향을 주는 버퍼풀은 MySQL서버 물리 메모리 80%를 버퍼풀로 할당할 정도인데요. 버퍼풀에서 대량의 데이터를 효율적으로 관리하기 위해서는 내부적으로 페이지라는 단위로 나누어서 관리하게 됩니다. 페이지 단위 페이지 단위는 데이터 파일를 의미하는 디스크와 버퍼풀을 의미하는 메모리 사이에서 한 번에 전송될 수 있는 데이터 단위를 의미합니다. LRU 알고리즘 동작 순서 버퍼풀은 대량의 데이터를 효율적으로 관리하기 위해 페이지라

InnoDB
스토리지 엔진 MySQL 서버에서 디스크에 데이터를 저장하거나 읽는 역할을 수행하는 것이 스토리지 엔진이며, 나머지는 MySQL 엔진이다. MyISAM vs InnoDB 둘 다 MySQL의 스토리지 엔진이다. MySQL 5.5 버전 이후에는 InnoDB를 기본 스토리지 엔진으로 사용한다. InnoDB는 트랜잭션 처리가 필요하고, 대용량의 데이터를 다루는 부분에서 효율적이다. MyISAM은 트랜잭션 처리가 필요 없고, Read 기능이 많은 서비스일수록 효율적이다. InnoDB commit, rollback, 장애 복구, 외래 키 등을 지원한다. 다수의 사용자 동시접속에 퍼포먼스를 내도록 설계되었다. 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼풀을 관리한다. 테이블과 인덱스를 테이블 스

MySQL Storage Engine 알아보기 - InnoDB
☕ 시작 이번 글에서는 지난 글에 이어, MySQL을 뜯어보는 시간을 가져보도록 하겠다. 그 중에서도 스토리지 엔진(InnoDB)의 동작원리에 대해서 알아보자. 🤔 InnoDB? MySQL 서버는 스토리지 엔진이 존재한다. 스토리지 엔진은 데이터를 디스크에 '쓰기'하거나 저장된 데이터를 '읽기'하는 역할을 한다. 스토리지 엔진은 여러 종류가 있고, InnoDB가 대표적으로 가장 많이 쓰인다. InnoDB는 트랜잭션 기능을 제공하고 대용량의 데이터를 다루기도 좋다. 그 외에도 다양한 기능들을 제공하기 때문에, 가장 인기가 많다.

[Database] InnoDB 스토리지 엔진 아키텍처
목차 InnoDB 스토리지 엔진 아키텍처 개요 InnoDB 버퍼 풀 Double Write Buffer 언두 로그 체인지 버퍼 리두 로그 및 로그 버퍼 어댑티브 해시 인덱스 InnoDB 스토리지 엔진 아키텍처 개요 아래 그림은 앞에서 InnoDB 스토리지 엔진의 아키텍처라고 살펴봤던 그림입니다. 이제 InnoDB를 이루는 구성요소 하나하나에 대해서 살펴보겠습니다. InnoDB 버퍼 풀 InnoDB 버퍼 풀은 InnoDB 스토리지 엔진에서 가장 핵심적인 부분으로, 디스크의 데이터의 파일이나 인덱스 정보를 메모리에 캐시해두는 공간입니다. 또한 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할도 합니다. 버퍼 풀의 크기 변경 버퍼 풀

[Database] InnoDB 의 특징
목차 InnoDB 스토리지 엔진의 특징 프라이머리 키(PK)에 의한 클러스터링 MVCC (Multi Version Concurrency Control) 잠금없는 일관된 읽기 자동으로 데드락 감지 자동화된 장애 복구 InnoDB 스토리지 엔진의 특징 InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하고, 그 때문에 동시성 처리가 가능하며 안정적이고 성능이 뛰어납니다. InnoDB의 구조는 다음과 같습니다. 우선 InnoDB의 구조를 기반으로 InnoDB의 특징부터 살펴보도록 하겠습니다. 프라이머리 키(PK)에 의한 클러스터링 InnoDB의 모든 테이블은 기본적으로 PK를 기준으로 클러스터링되어 저

Buffer Management of MySQL/InnoDB - Processing Page Read Request
Analyzing Flushing Patterns in MySQL by Varying the Size of Buffer Pool, Mijin Ahn, Sang-Won Lee, Sungkyunkwan University Database I/O Architecture Transaction SQL statements의 sequence read & write의 sequence SQL statement SELECT: reads tuple from pages INSERT / DELETE / UPDATE: write reco
InnoDB VS MyISAM
MySQL은 각 데이터베이스(스키마라고도 불리는)를 파일시스템 안의 데이터 디렉터리의 하위 디렉터리로 저장한다 테이블을 생성하면 MySQL은 테이블 이름과 같은 이름을 가진 .frm 파일을 만들고 그 안에 테이블 정의 정보를 저장한다 MYSQL 스토리지 엔진 종류는 InnoDB 엔진, MyISAM 엔진, Memory 엔진, Archive 엔진, CSV 엔진, Federated 엔진 등 이있지만 제일 많이 사용하는 InnoDB 엔진, MyISAM 엔진에 대해 알아 보려고 한다 MySQL의 스토리지 엔진으로 가장 많이 InnoDB와 MyISAM을 사용한다 InnoDB 엔진은 트랜잭션 처리가 필요하고 대용량의 데이터를 다루는 부분에서 효율적이고, MyISAM 엔진은 트랜잭션 처리가 필요 없고, Read only 기능이 많은 서비스일수록 효율적이다. 한줄로 정리하면, InnoDB는 데이터의 변화가 많은 서비스에, MyISAM은 SELECT가 많은 서비스에 적합하다 할 수

[MySQL] InnoDB vs MyISAM + Memory
InnoDB vs MyISAM MySQL에서는 아래와 같은 여러 스토리지 엔진을 지원한다. > InnoDB 엔진 MyISAM 엔진 Memory 엔진 Archive 엔진 CSV 엔진 Federated 엔진 MySQL의 스토리지 엔진으로 가장 많이 사용하는 엔진으로는 InnoDB와 MyISAM이 있다. InnoDB 엔진은 트랜잭션 처리가 필요하고 대용량의 데이터를 다루는 부분에서 효율적이고, MyISAM 엔진은 트랜잭션 처리가 필요 없고, Read only 기능이 많은 서비스일수록 효율적이다. 한줄로 정리하면, InnoDB는 데이터의 변화가 많은 서비스에, MyISAM은 SELECT가 많은 서비스에 적합하다 할 수 있다. 용도에 따라 InnoDB나 MyISAM 스토리지 엔진을 결정하는데, InnoDB와 MyISAM 테이블을 같이 사용할 경우, 조인시 주의해야한다. >
[MySQL] MySQL InnoDB 사용시 Error : #1286 - Unknown table engine 'InnoDB'
해당 오류를 해결하려고 my.ini 파일을 수정해보고 여러가지 방법을 해봤지만, 나 같은 경우는 mariaDB를 이전에 사용하고 제대로 삭제처리를 안해서 mysql 설치할때 mariaDB경로가 자동으로 설정이 되어 발생한 문제였다. 결국 mysql을 삭제하고, mariadb를 사용했던 아파치 프로그램을 지운 후 다시 재설치하니 제대로 InnoDB가 사용되었다.
MySQL 아키텍처 - InnoDB 스토리지 엔진 아키텍처
InnoDB 스토리지 엔진의 주요 특징에 대해 정리 프라이머리 키에 의한 클러스터링 프라이머리 키 값의 순서대로 디스크에 저장 프라이머리 키가 클러스터링 인덱스이므로 프라이머리 키를 이용한 레인지 스캔이 빨리 처리 됨 MVCC(Multi Version Concurrency Control) 잠금을 사용하지 않는 일관된 읽기를 제공(즉, InnoDB에서 읽기 작업은 다른 트랜잭션이 가지고 있는 잠금을 기다리지 않고 읽기 작업이 가능) 언두 로그(Undo log)를 이용하여 하나의 레코드에 대해 여러 개의 버전을 동시에 관리하여 이 기능 구현 transaction_isolation에 설정된 격리 수준에 따라 레코드 조회 값이 달라진다. 자동 데드락 감지 잠금 대기 목록을 관리 잠금이 교착 상태에 빠지지 않았는지 체크하기 위함 교착 상태에 빠진 트랜잭션을 강제 종료하기도 함 언두 로그 레코드를 적게 가진 트랜잭션이 강제종료(롤백)의

[MySQL] - InnoDB vs MyISAM & 5.7 vs 8.0
InnoDB InnoDB는 사용자의 데이터를 보호하고 내결함성을 제공하는 commit, rollback 및 충돌 복구 기능과 같은 기능을 갖춘 MySQL용 transaction-safe (ACID 호환)스토리지 엔진이다. row-level locking을 사용하며 MVCC/Snapshot read(non-locking 읽기 방식)으로 다중 사용자의 동시성과 성능을 향상시킨다. InnoDB는 일반 쿼리에 대한 I/O를 줄이기 위해 Primary key를 기반으로 클러스터형 인덱스에 사용자 데이터를 저장한다. 또한 데이터 무결성을 유지하기 위해 Foreign key 참조 무결성 제약 조건도 지원한다. MyISAM MyISAM은 My Indexed Sequential Access Method의 약어로 웹, 데이터 웨어하우징 및 기타 분석 환경에서 자주 사용된다. MyISAM 스토리지 엔진은 모든 MySQL 구성을 지원한다. 2009년

MySQL InnoDB와 MyISAM
Amazone RDS에서 MySQL instance를 생성할 때 아래와 같은 문구가 있다. InnoDB와 MyISAM간 어떤 차이가 있길래 InnoDB 엔진에서만 자동 백업을 지원할까? 궁금해서 찾아봤다. InnoDB InnoDB는 사용자의 데이터를 보호하고 내결함성을 제공하는 commit, rollback 및 충돌 복구 기능과 같은 기능을 갖춘 MySQL용 transaction-safe (ACID 호환)스토리지 엔진이다. row-level locking을 사용하며 non-locking 읽기 방식으로 다중 사용자의 동시성과 성능을 향상시킨다. InnoDB는 일반 쿼리에 대한 I/O를 줄이기 위해 Primary key

InnoDB Page Structure
학습자료 https://dev.mysql.com/doc/internals/en/innodb-page-structure.html https://dev.mysql.com/doc/internals/en/innodb-record-structure.html https://www.codetd.com/en/article/14007258 > 코드스쿼드 BE 과정을 진행 중에 발표세션이 있어서, DB 수업과 관련해서 찾아보던 중 innoDB page structure를 공부하고, 정리하게 되었습니다. ![](https://velog.