[Database] Database Engine
기본적으로 데이터를 컴퓨터의 디스크에 안전하게 저장하는 역할을 수행한다.
트랜잭션 관리 / 캐시 관리 / 동시성 제어 / 복구 관리 등.. 디스크 저장과 관련된 전략을 결정하고, B-Tree / B+Tree 등 데이터를 저장할 때 어떤 자료구조를 사용할 지도 결정한다.
디스크 저장과 관련된 모든 작업을 총괄한다고 생각하면 된다.
DBMS의 주요한 차이점 중 하나는 DBMS가 사용하는 데이터베이스 엔진의 구현과 특성이다.
PostgreSQL, MySQL, Oracle 등 여러 DBMS는 데이터베이스 엔진이 제공하는 데이터 처리 위에서 사용자와 애플리케이션의 요구사항에 맞춘 다양한 기능을 제공한다. (GUI, Session, 스키마, Query...)
MyISAM
MySQL 및 MySQL의 fork 버전인 MariaDB, Percona에서 사용되는 엔진 중 하나로, MySQL 5.5 버전까지는 기본 데이터베이스 엔진으로 사용됐지만, 이후 버전부터는 InnoDB로 바뀌었다.
인덱스를 생성할 때 B-Tree 자료구조를 기반으로 하는 인덱스를 사용해 데이터 접근 시간을 단축시킬 수 있지만, 트랜잭션을 지원하지 않아 데이터의 ACID 속성을 보장하려면 추가적인 로직을 작성해야 하고, 테이블이 손상된 경우 수동으로 복구해야 한다.
테이블 수준의 락을 사용해 동시성이 떨어지고, INSERT 속도가 빠르지만 UPDATE나 DELETE 작업은 느리다.
InnoDB
MyISAM에서는 인덱스가 파일 내 형의 실제 위치를 가리키는 non-clustered 인덱스이지만 InnoDB에서는 B+Tree 자료구조 기반의 clustered 인덱스 구조를 사용한다.
테이블의 PK가 물리적인 정렬 방식을 결정하고, 인덱스 파일과 데이터 파일이 따로 존재하는 MyISAM과는 다르게 인덱스가 행을 포함하기 때문에 PK로 검색할 때 성능이 좋다.
트랜잭션과 FK를 제약을 지원해 데이터 무결성을 보장하고, Tablespace를 사용해 공간을 효과적으로 사용한다. (MyISAM은 테이블 단위로 데이터를 관리해 테이블은 별도의 파일 세트로 저장한다)
행 수준 락을 사용해 데이터베이스의 성능을 끌어올린다.
MySQL의 기본 데이터베이스 엔진으로 사용되며, 오라클이 MySQL을 인수한 이후 InnoDB 엔진도 오라클이 관리하고 있다.
SQLite
로컬 데이터를 저장하고 관리하기 위해 사용되는 임베디드 데이터베이스 엔진이다.
기본적으로 B-Tree 인덱스 구조를 사용지만 더 나은 성능을 위해 LSM 확장이 개발돼 대용량 WRITE 연산을 처리할 때 유용하다.
SQLite를 사용하면 사용자가 한 명일 가능성이 높지만.. 테이블 수준의 락을 사용하고 ACID 트랜잭션을 지원한다.
웹 브라우저에서도 개발자 도구의 Web SQL에서 SQLite를 사용할 수 있다.
클라이언트 측 데이터베이스를 사용해 브라우저 내에서 데이터를 저장하고 조작할 수 있다. (오프라인)
LevelDB
구글에서 개발한 오픈소스 데이터베이스 엔진으로 LSM (Long Structured Merge Tree) 구조를 사용해 B-Tree 구조보다 쓰기 연산 속도가 빠르다.
여러 레벨의 저장 구조를 사용해 대량의 데이터를 효율적으로 처리한다.
Memtable을 주 메모리 구조로 사용하고, Memtable이 일정 크기에 도달하면 Level0으로 플러쉬된다.
이후 Level0은 Level1 ~ Level6 까지로 확장된다.
데이터가 상위 레벨로 이동할 때 해당 레벨의 여러 파일이 결합돼 더 큰 단일 파일을 형성하고, 이 과정을 통해 데이터의 중복을 줄여 성능을 향상시킨다.
비트코인 코어와 오토캐드에서 사용되지만, 트랜잭션을 지원하지 않아 엔터프라이즈 애플리케이션에서는 사용되기 힘들다.
RocksDB
LevelDB를 기반으로 페이스북이 만든 데이터베이스 엔진으로 SSD 스토리지에서 성능이 좋다.
트랜잭션을 지원해 대규모 웹 서비스에서 사용되며 MySQL와 MongoDB에서 사용될 수 있도록 MyRocks 스토리지 엔진을 제공한다.
Aria
MariaDB에 특화된 엔진으로 MyISAM 엔진과 매우 유사하지만 비정상적으로 종료됐을 때 데이터의 일관성을 유지할 수 있다.
이 외에도 정말 많은 데이터베이스 엔진이 있다.
MySQL - InnoDB / MyISAM 처럼 DBMS와 데이터베이스 엔진이 명확하게 구분되는 DBMS가 있고
SQLite, RocksDB 처럼 데이터베이스 엔진이 전체 DBMS의 기능을 단독으로 수행하는 경우도 있다.
요점은 시스템의 요구사항을 분석하고 적절한 DBMS나 데이터베이스 엔진을 선택하는 것이니..
MySQL을 사용할 때는 언제 어떤 데이터베이스 엔진을 사용할 지 결정하고, 다른 DBMS를 사용할 때도 어떤 데이터베이스 엔진을 사용할 지를 요구사항에 맞춰서 결정하자.
MySQL에서는 트랜잭션이 필요한 엔터프라이즈 애플리케이션을 다루는 테이블에는 InnoDB를, 읽기 성능이 중요한 테이블에는 MyISAM을 사용하도록 설정할 수 있다
'Database > Database' 카테고리의 다른 글
[Database] 동시성 처리 (0) | 2024.04.13 |
---|---|
[Database] Sharding (0) | 2024.04.08 |
[Database] Partitioning (0) | 2024.04.04 |
[Database] B+Tree 자료구조 (0) | 2024.03.30 |
[Database] 내부 저장 구조 (0) | 2024.01.29 |
댓글
이 글 공유하기
다른 글
-
[Database] 동시성 처리
[Database] 동시성 처리
2024.04.13 -
[Database] Sharding
[Database] Sharding
2024.04.08 -
[Database] Partitioning
[Database] Partitioning
2024.04.04 -
[Database] B+Tree 자료구조
[Database] B+Tree 자료구조
2024.03.30