원티드 백엔드 온보딩 챌린지 2월 수업을 듣고 기억하고 싶은 부분의 데이터베이스와 MySQL 관련 내용을 간략하게 정리했다. 하단 내용은 수업내용 + 공부하면서 찾은 내용들을 정리한 자료이다.

 

 

데이터베이스 원칙 

  • 무결성, 안전성, 확장성

 

 

데이터베이스 종류

  • relational (MySQL, Oracle) 
  • key-value (Redis, Dynamo DB)
  • graph (Neo4j, OrientDB)
  • document (MongoDB)

 

 

Row-Oriented vs. Column-Oriented

 

Name CountryCode District Population
Kabul AFG Kabol 1780000
Qandahar AFG Qandahar 237500

 

Row-Oriented 는 말 그대로 row 순서대로 저장되는 행 기반 데이터베이스를 말한다. row 별로 삭제를 하거나 추가를 할 때 성능이 좋다.

Kabul AFG Kabol 1780000 Qandahar AFG Qandahar 237500

 

Column-Oriented 는 특정 필드 순서대로 저장되는 컬럼 기반 데이터베이스인데, 특정 필드 데이터 집합을 조회할 때 유리하다. 

Kabul Qandahar AFG AFG Kabol Qandahar 1780000 237500

 

어떤 데이터베이스를 선택할까? 

데이터베이스에 일관성, 가용성, 분산처리를 고려해서 선택하자. (CAP Theorem)

 

 

RDBMS vs. NoSQL

RDBMS와 NoSQL의 가장 큰 차이점은 저장되는 데이터 구조가 다르다는 점이다. RDBMS는 스키마에 맞춰 정합성을 보장하는 테이블 구조로 구성되어 있다. NoSQL은 비관계형 데이터베이스이며, NoSQL에 대한 다양한 의미 해석이 있지만 주로 Not Only SQL으로 해석된다. RDBMS보다 좀 더 데이터 저장 방식이 다양하고 검색에 특화된 매커니즘을 제공한다.

 

 

트랜잭션 Transaction

트랜잭션은 데이터 부정합을 방지하고자 할 때 사용한다. 여기서 데이터 부정합이란, 메모리 상에서 데이터 변경이 있을 경우, 데이터베이스의 값과 일치화 시키는 과정에서 데이터 값이 다른 경우를 말한다. 

 

 

MySQL 스토리지 엔진

 

 

MySQL에서 InnoDB는 따로 설정하지 않아도 선택되는 default 값이며, 스토리지 엔진에 따라 트랜잭션 사용여부와 데이터를 읽고 쓰는 방식이 상이하다. 

 

테이블 생성방식을 보고 싶을 때 사용하면 되는 명령어

SHOW CREATE TABLE

이렇게 명령어를 사용해서 이 테이블이 어떻게 생성됐는지 SQL를 확인할 수 있다. 여기서 world 데이터베이스의 city 테이블은 MySQL에서 원래 제공하는 데이터다.

 

 

Database Lock vs. Isolation Level

데이터베이스 락과 트랜잭션 격리수준은 둘 다 동시성 제어를 위해 사용된다. 여기서 동시성이란 동시에 실행되는 것처럼 보이는 싱글 코어의 멀티 스레드를 동작시키는 방식을 말한다. 

 

Database Lock 

먼저, 데이터베이스 락은 하나의 매커니즘이다. DBMS에 락을 걸어서 한 번에 하나의 접근으로만 리소스가 사용될 수 있도록 하는 것으로 충돌을 방지하고 데이터 일관성을 유지시키는 역할을 한다. 

 

MySQL에는 글로벌 락, 테이블 락, 네임드 락, 메타데이터 락, 레코드 락이 있다.

글로벌 락은 서버 전체에 영향을 미치는 락으로 SELECT 제외 모든 쿼리들이 락이 걸리는 것이고, 테이블 락은 특정 테이블에만 해당된다. 네임드 락은 특정 문자열에 대한 잠금으로 복잡한 요건의 트랜잭션이 아닌 이상 자주 사용되지는 않는다. 메타데이터 락은 메타데이터를 저장하는 경우 발생하는 락으로 메타데이터의 종류는 테이블 정의, 인덱스 정보 등이 있다. 이 때 다른 트랜잭션이 메타데이터를 수정하거나 접근하는 것을 막는다. 레코드 락은 개별적인 테이블의 행 또는 레코드에 걸리는 락으로 MySQL 서버의 필요에 따라, 격리 수준에 따라 자동적으로 획득되거나 해제된다. 

 

락의 종류는 잠금을 구현하는 방식에 따라 공유 락(Shared Lock / Read Lock)과 배타 락(Exclusive Lock / Write Lock)으로도 나눌 수 있다.

 

InnoDB에 락 방식에 대해서는 이렇게 분리하고 있다. 

 

 

Isolation Level

여러 트랜잭션이 있을 때, 다른 트랜잭션에서 변경하거나 조회하는 데이터, 사용중인 리소스를 볼 수 있게 할 수 있을지를 정하는 것을 말한다.

2023.02.20 - [Database] - [MSSQL] 트랜잭션 격리수준(TRANSACTION ISOLATION LEVEL)

 

MySQL 효율 개선하기

인덱스 활용, 데이터 중복개선, 파티셔닝, 캐시, 기타 query optimization 등의 방법들이 있다. 

 

어떤 인덱스를 사용해야 할까?

인덱스를 사용하는 것은 특정 값을 찾거나 테이블 값의 범위를 정해서 쿼리 검색속도를 높이는데 도움이 된다. 주로 pk나 특정 컬럼을 사용해서 인덱스로 만든다.

인덱스를 설정할 때는 업데이트 빈도가 높은 컬럼은 오히려 검색속도를 늦출 수 있기 때문에 피하는 것이 좋다.

그리고 인덱스 키 값의 크기는 적절히 조절할 필요가 있다. 사이즈가 큰 경우 검색결과에 제한을 두는 정보를 더 많이 얻을 수 있다는 장점이 있지만, 더 많은 메모리를 필요로 하고 성능이 낮아질 수 있다는 단점이 있다.

댓글