이론 정리/Database 17

MySql 인덱스 - 기본 개념

MySQL 인덱스 실무에서 엄청나게 중요한녀석임... 이를 사용해서 select를 할 때에 데이터를 빠르게 응답하도록 할 수 있음! 사실 인덱스를 한다고 뭐 쿼리가 바뀌는건 아니다. 그냥 이걸 통해 속도를 빠르게 하는거임. 데이터베이스를 빠르게 하도록 하는 "튜닝" 에서 가장 핵심적인 것이 인덱스이다. 물론 막 쓰면 오히려 성능을 떨어뜨릴 수도 있다. 그래서 일단 인덱스의 개념이랑 활용 등을 찾아보도록 한다. 인덱스 개념 예를 들어 데이터베이스에 사람 이름 키 몸무게 을 갖는 테이블이 있을 때 1 류찬 178 70 2 김찬 189 99 3 박찬 140 39 4 이찬 180 34 5 반찬 200 50 6 징기스찬 160 50 7 가슴이벅찬 390 34 요런 식으로 있다고 하자. (일단 동명이인은 없다고 가..

Mysql 엔진 Lock

MySql 엔진 lock Mysql 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미친다. 글로벌 락(Global lock) FLUSH TABLES WITH READ LOCK 위의 명령을 통해 획들 가능한 잠금이다. 글로벌 락의 특징 MySql에서 제공하는 잠금 중 가장 범위가 큰 잠금이다. 해당 락이 활성화되면 전체 테이블/DB가 영향을 받는다. select를 제외한 DDL, DML문장은 글로벌 락이 해제되기 전까지 대기하게 된다. 해당 락은 MySql의 모든 테이블에 잠금을 걸게 된다. 추가적으로, 모든 테이블/DB에 대해 잠금을 걸기 때문에 해당 락 명령 실행 이전에 수행되던 트랜잭션/SQL이 끝날 때까지 대기하게 된다. 참고로 모든 SQL에 대해서이기 때문에 락 대상이 아닌 select 명령도 ..

캐시 전략

Redis의 캐싱 전략 개발을 할 때에 Redis를 통해서 값을 캐싱시켜 둔다면, 더 빠르게 값들을 처리할 수 있다. 이 이유를 간단하게 말하자면 DB를 통해 값을 가져오는 것 보다 캐시에 있는 데이터를 사용하면 성능면에서 더 빠르기 때문이다. 그렇기 때문에 cache miss(캐시된 데이터가 없어서 DB를 통해 해당 값을 가져온다.)를 적게 하고 cache hit(캐시된 데이터에서 바로 값을 가져옴)를 최대한으로 해야 한다. 또한 캐시는 RAM데이터를 사용하는데, 이게 데이터가 크지 않기 때문에 이를 잘 관리해야 한다. 즉 최대한 DB서버를 통하지 않고 Redis를 통해 값을 받을 수 있도록 하기 Redis의 크기를 효율적으로 관리하기 를 해내야 할 것이다. 이를 위한 전략들을 살펴보도록 한다. 읽기 ..

shared lock, exclusive lock

Shared lock과 Exclusive lock에 관하여 해당 lock들은 DB자체에서 걸어주는 lock으로, InnoDB의 Row-level lock이다. 이거랑 이거랑 이거를 읽고오면 좀더 이해가 쉬울 것이다. 간단히 예를 들어 설명하겠다. 예를 들어 DB에 다음과 같은 데이터가 있다고 가정해 보자 그런데 만약 A는 류찬의 외모를 읽음 B는 류찬의 외모를 잘생김에서 멋짐으로 변경 C는 류찬의 외모를 읽음 한다고 생각해보자. A Transaction에서 류찬의 외모를 가져오는 중(잘생김) B Transaction에서 류찬의 외모를 멋짐으로 변경(멋짐으로 변경) C Transaction에서 류찬의 외모를 가져옴 (멋짐) A Transaction에서 류찬의 외모를 가져옴 (잘생김) 이렇게 되는 이유는, ..

낙관적/비관적 lock, named lock

pessimistic Lock 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법 이걸 걸면 다른 트랜잭션에서는 lock이 해제되기 전에 데이터를 가져갈 수 없다. 데드락이 걸릴 수 있어 주의 필요 Optimistic Lock 실제로 lock을 이용하지 않고 버전을 이용해서 정합성을 맞추는 버전 먼저 데이터를 읽은 후에 update를 수행할 때 내가 읽은 버전이 맞는지 확인하여 업데이트한다. 내가 읽은 버전에서 수정사항이 생기는 경우 application에서 다시 읽은 후에 작업 수행 필요 Named Lock 이름을 가진 metadata locking이다. 이름을 가진 lock을 획득한 후 해제할때까지 다른 세션은 이 lock을 획득할 수 없다. transaction이 종료될 때 자동으로 lock이 ..

Redis - cache, persistence 기초

Redis란? In-memory Data structure Store BSD 3 License Open Source 레디스를 쓸 때에 마음대로 코드를 수정하거나, 숨기거나 할 수 있다. 추가로 Redis module은 느낌이 다른데, 이건 Redis Enterprise를 제공해주는걸로 얘는 변경시 코드를 공개해야한다. Support Data Structures String, set, sorted-set, hashed, list Hyperloglog 유일한 원소 개수 추정에 사용되는 알고리즘. 속도가 매우 빠르고 오차가 적다고 한다. bitmap geospatial index 나에게서 얼마만큼의 거리에 있는 데이터들을 가져온다. stream Only 1 Committer 레디스 소스를 고칠 수 있는 사람은..

트랜잭션의 격리수준과 문제점, 그리고 해결법

트랜잭션의 격리수준 동시에 여러 트랜잭션을 처리할 때에, 얼마나 이들이 서로 고립되어 있는지를 의미한다. 즉, A라는 트랜잭션이 B라는 트랜잭션 내에서 변경한 데이터를 보는 기준점을 결정한다. 격리수준의 종류 이는 4가지로 분류할 수 있는데, READ UNCOMMITTED 커밋되지 않은 데이터를 읽을 수 있음 READ COMMITTED 커밋된 데이터만 읽을 수 있음 REPETABLE READ 트랜잭션 동안 같은 데이터를 읽을 수 있음 SERIALIZABLE 트랜잭션의 순차적 실행 이다. 한번 하나하나 살펴보자. READ UNCOMMITTED 아직 커밋되지 않은 데이터를 읽을 수 있는 격리 수준이다. 즉 Transaction의 COMMIT이나 ROLLBACK과 상관 없이 해당 트랜잭션의 데이터를 확인 가능..