- MySQL 복습 : MVCC, UNDO
- MySQL 인덱스 공부
- 컴퓨터 구조 공부
잠금과 격리
- 잠금과 격리
- 잠금은 데이터가 동시에 작업하는 트랜잭션으로 인해 손상되지 않도록 하는 매커니즘이다.
- 격리란 동시에 실행되는 트랜잭션은 서로 격리된다는 것을 의미한다.
- 서로 다른 트랜잭션간 데이터 격리?
- 예를 들어 한 트랜잭션에서 여러 번 쓴다면 다른 트랜잭션은 그 내용을 전부 보든지 아무것도 볼 수 없든지 둘 중 하나여야하지 일부분만 봐서는 안된다.
MVCC
- InnoDB는 multi-version storage engine 으로서 row의 변경 정보를 관리해 동시성과 롤백 등 트랜잭션을 지원한다.
- 변경 전 정보를 undo 영역에 저장된다.
- 잠금 없는 일관된 읽기에도 쓰인다
- MVCC란 특정 격리수준에서 트랜잭션이 일관된 읽기를 가능하게 한다.
일관된 읽기란 어느 트랜잭션이 레코드를 변경했지만 아직 커밋하지 않은 시점에 다른 트랜잭션이 이 데이터를 읽기하면 변경 이전의 레코드를 읽을 수 있는 것이다.
Undo
- UNDO 로그는 insert undo log 와 update undo log 로 분류된다.
-
undo 영역에서 삭제 시점 : insert undo log 는 오직 트랜잭션 롤백 시 필요하기 때문에 해당 트랜잭션이 commit 후 바로 삭제된다.
-
update undo log 롤백뿐만 아니라 잠금없는 일관된 읽기에도 사용된다.
undo 영역에서 삭제 시점 : but they can be discarded only after there is no transaction present for which InnoDB
has assigned a snapshot that in a consistent read could require the information in the update undo log to build an earlier version of a database row.
파인만 기법
매일 안다고 착각하며 멘토링에 참여하면 박살난다.
아는 것과 모르는 것을 구분해야 되는데 파인만 기법 써보자.
- 알고 싶은 주제를 골라 공부한다.
일단 무엇이든 관심 있는 주제를 골라 그에 대한 조사를 하고 관련 내용을 파악해 봅니다.
- 알게 된 내용을 가르쳐 본다
선생님이 되어 학생들을 가르친다고 생각하고 알고 있는 모든 것을 적어 봅니다. 배우는 학생은 이 주제에 대해 아무 것도 모르는 평범한 어린 아이라고 생각합니다. 복잡한 단어는 알아듣지 못 합니다. 최대한 평범하고 일상적인 단어들로만 설명해 봅니다.
- 설명하기 어려운 부분을 골라낸다
어린이를 앞에 두고 가르친다고 생각하며 설명하다보면 막히는 부분이나, 설명이 명확하지 않은 부분, 복잡한 단어로 설명해야만 할 것 같은 부분들이 나올 터입니다. 그 부분이 아직 충분히 이해하지 못 한 부분입니다. 자신이 무엇을 모르는지 아는 것은 중요합니다.
- 다시 공부하고 정리합니다.
이제 불명확한 부분을 중심으로 다시 주제를 파고 듭니다. 이해한 내용을 다시 정리하고 최대한 간단하고 쉬운 이야기로 풀어봅니다. 쉬운 말로 정확한 비유를 만들어 봅니다. 기왕이면 진짜 강의한다고 생각하고 소리를 내어 말해보는 것도 좋습니다.
출처 : 여기
MySQL - index
1. 알고 싶은 주제
2. 알게 된 내용
- index 는 색인으로 데이터의 위치를 나타네는 key-value 로 구성된 데이터다.
- index 는 데이터 조회시 빠른 검색을 위해 사용한다.
- index 의 종류에는 pk, fk, 보조인덱스, 유니크 인덱스가 있다.
pk는 레코드를 식별하기 위한 인덱스다. mysql 스토리지 엔진은 인덱스 지정을 하지 않아도 기본적으로 pk 에 대해 클러스터링 인덱스를 만든다.
유니크 인덱스와 pk 의 차이점은 인덱스로 지정된 컬럼이 null 허용여부이다.
- 인덱스를 사용하는 이유는 조회를 빠르게하기 위해서다. SELECT 조건에 해당하는 데이터가 있는 페이지는 파일에 연속된 공간에 있지 않아 검색을 위해 랜덤 i/o를 할 가능성이 높다. 이는 비용이 큰 작업이다. 그래서 인덱스 컬럼과 해당 레코드의 위치를 key, value 쌍으로 미리 정렬해두는 것이다.
3. 설명하기 어려운 부분
- 인덱스를 잘 사용해야 file 랜덤 아이오 i/o 를 줄일 수 있는가? 그렇다면 왜인지 설명하기 어렵다.
- 인덱스를 정렬한다는데 어떻게 정렬하는지 설명하기 어렵다.
4. 다시 정리
- DB에서 데이터 조회는 디스크에서 데이터를 찾아야 한다. 이는 랜덤 I/O 를 발생시킨다. 그래서 쿼리를 튜닝한다는 것은 랜덤 I/O를 줄여주는 것이 목적이라할 수 있다. 즉, 필요한 데이터만 읽도록 쿼리를 개선하는 것이다.
- Index는 데이터를 디스크에서 찾을 때 전체를 뒤질 필요 없이 컬럼과 해당 레코드 위치를 key, value 로 저장해두는 것이다.
- 인덱스 데이터에서도 조회가 필요한데 인덱스를 정렬된 상태로 유지한다. 인덱스가 추가될때마다 다시 정렬하는 비용이 발생한다.
- 그래서 인덱스는 데이터 저장 성능을 희생하고 읽기의 속도를 높이는 기능이다.
- 인덱스는 컬럼과 레코드의 위치값 쌍으로 구성된다 했는데 컬럼을 기준으로 4가지 종류가 있다.
- PK : 레코드의 식별값으로 만들어진 인덱스며 Null 이나 중복을 허용하지 않는다.
- PK 를 제외한 인덱스를 세컨더리 인덱스라고 한다.
- FK
- 보조 인덱스
- 유니크 인덱스 : PK 와 차이점은 인덱스에 사용되는 컬럼에 NULL을 허용한다.
- 인덱스 저장 방식은 대표적으로 B-Tree 와 Hash 알고리즘이 있다.