DB/MySQL

DB/MySQL

트랜잭션 격리 수준

트랜잭션 격리 수준이란?트랜잭션의 격리 수준(isolation level)은 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할 지 수준을 결정하는 것이다. 격리 수준은 `READ UNCOMMITTED`, `READ COMMITTED`, `REPEATABLE READ`, `SERIALIZABLE`의 4가지로 나뉜다. "DIRTY READ"라고도 하는 `READ UNCOMMITTED`는 일반적인 DB에서는 거의 사용되지 않고, `SERIALIZABLE` 또한 동시성이 중요한 DB에서는 거의 사용되지 않는다. `READ UNCOMMITTED`에서 `SERIALIZABLE`로 갈 수록 트랜잭션간의 데이터 격리(고립)정도가 높아지며, 동시 처리 성..

DB/MySQL

InnoDB 스토리지의 인덱스와 락

InnoDB에서의 락 방식 - 인덱스에 대한 락InnoDB의 잠금은 레코드를 잠그는 것이 아니라, 인덱스를 잠그는 방식으로 처리된다. 즉, 변경해야 할 레코드를 찾기 위해 검색한 인덱스의 레코드를 모두 락을 건다. 다음의 예시를 통해 인덱스를 통한 락에 대해 이해해보자. - employees 테이블에 first_name 칼럼만 멤버로 담긴 ix_firstname이라는 인덱스가 있다.- employees 테이블에서 first_name='asdf'인 사원은 전체 200명이고- first_name='asdf' 이면서 last_name='qwer'인 사람은 딱 1명이다. first_name='asdf' 인 사람의 수를 찾는 쿼리는 아래와 같다. `SELECT COUNT(*) FROM employees WHERE..

DB/MySQL

MySQL의 InnoDB 스토리지 엔진 레벨 락

이전 글에서 작성한 것처럼, 잠금(Lock)은 그 적용 범위에 따라 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다.이번 글에서는 InnoDB의 스토리지 엔진 레벨 락에 대해 정리해 보았다.InnoDB 스토리지 엔진 락InnoDB 스토리지 엔진은 MySQL에서 제공하는 락과는 다르게, 스토리지 엔진 내부에서 레코드 기반의 잠금 방식을 사용한다. 이 방식 덕분에, MyISAM보다 동시성 처리에서 더 뛰어나지만, 이원화된 락 방식 때문에 InnoDB 스토리지 엔진에서 사용되는 락은 MySQL 명령어를 이용해 접근하기 까다롭다.레코드 기반의 락 기능을 제공한다.락 정보가 작은 공간으로 관리되어, 레코드락이 페이지락 또는 테이블 락으로 레벨업되는 락 에스컬레이션은 없다.InnoDB 스토리지 엔진에서는..

DB/MySQL

트랜잭션과 락

트랜잭션이란?MySQL에서의 트랜잭션은 하나의 논리적인 작업 셋에 쿼리의 개수와 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(Commit을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK / 오류) 함을 보장해 주는 것이다.MyISAM 테이블에서는 수행 중 오류가 발생했어도, 이미 실행 된 쿼리의 결과는 놔두고 종료한다.InnoDB에서는 이와 다르게, 수행 중 오류가 발생했으면 이미 실행 된 쿼리의 결과까지 같이 롤백한다.MyISAM 테이블에서의 이런 현상은 Partial Update라고 표현하며, 이는 데이터의 정합성을 맞추는 것을 어렵게 할 수 있다.잠금(Lock)잠금 범위 기준 구분MySQL에서 사용되는 잠금은 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다.MySQL 엔..

DB/MySQL

[MySQL] B-Tree

MySQL에서는 인덱스를 구현할 때 기본적으로 B-Tree를 사용한다. B-Tree에 대해 알아보자.B-Tree란B-Tree(Balanced Tree, 균형 트리)는 범용적으로 사용되는 데이터의 구조로, 주로 인덱스를 표현할 때와 그 외에서도 많이 사용된다. 이름에서도 알 수 있듯 균형이 잡힌 트리이다.노드 Node트리 구조에서 데이터가 존재하는 공간. 즉, 갈라지는 부분의 '마디'이다.루트 노드는 노드의 가장 상위 노드이고, 나머지 노드들은 모두 이 노드의 자식이다.리프 노드는 가장 마지막에 존재하는 노드이다.페이지 PageMySQL이 B-Tree를 사용할 때 이 노드에 해당되는 것이 페이지이다.페이지눈 16Kbyte 크기의 최소한의 저장 단위로, 하나의 데이터만 저장한다고 해도 하나의 페이지를 차지하..

DB/MySQL

[MySQL] InnoDB에서의 키와 인덱스

키와 인덱스기본 키(Primary key)는 테이블의 각 행을 고유하게 식별한다.기본 InnoDB 스토리지 엔진의 경우, 기본 키가 클러스터형 인덱스로도 사용된다. 즉, 실제 테이블 데이터가 모두 인덱스 구조에 저장된다는 것이다. 이는 데이터와 인덱스를 별도로 저장하는 MyISAM과 다르다.참고) InnoDB와 MyISAM은 모두 MySQL에서 제공하는 데이터 스토리지 엔진이며, 현재는 InnoDB가 기본 엔진이다.InnoDB : https://dev.mysql.com/doc/refman/8.4/en/innodb-introduction.htmlMyISAM : https://dev.mysql.com/doc/refman/8.4/en/myisam-storage-engine.html테이블이 클러스터형 인덱스를 ..

DB/MySQL

[MySQL] 인덱스의 개념과 종류

인덱스의 개념인덱스 - 데이터를 좀 더 빠르게 찾을 수 있게 하는 도구인덱스란색인과 같은 개념으로, 내용 중 찾고자 하는 것이 있을 때 전체를 순차적으로 찾아보는 것(Full Table Scan)이 아니라, 색인을 보고 나와 있는 페이지로 바로 찾아가는 형식이다.적은 데이터에서는 인덱스의 유무가 크게 체감되지 않을 수 있지만, 실무에서 사용되는 수천만, 많게는 수억건 이상의 데이터의 경우 인덱스 없이 조회를 하게 된다면 오랜 시간이 걸리게 되고, 낮은 성능을 보이게 된다.인덱스의 장점많은 데이터를 사용할 시 검색 속도를 대폭 개선할 수 있다. (단, 항상은 아님)인덱스를 생성하고, 인덱스를 사용하는 SQL을 만들어 사용한다면 기존보다 아주 빠른 응답 속도를 얻을 수 있다.서버 입장에서는 적은 처리량으로 ..

yoursin
'DB/MySQL' 카테고리의 글 목록