-
Notifications
You must be signed in to change notification settings - Fork 0
9‐2. MySQL에서 왜 sequence를 찾아?
hyeonsunny edited this page Feb 7, 2025
·
4 revisions
모든 의사결정에는 타당한 이유가 있어야하지만 이 프로젝트의 데이터베이스는 여태 회사에서 써온 MariaDB가 아닌 (단순히)오픈소스 데이터베이스 1위인 MySQL를 써보고 싶었다.
하지만 왜 1위인지, MariaDB와 무엇이 다른점이 있는지, 언제 구분하여 사용해야하는지 알지 못한 선택이였다.
고민이 짧았던 선택은 MySQL에서 sequence를 찾는 부끄러운 결과를 남길 수 밖에.. 문제될 것 없을거라 생각했던 데이터베이스 선택하기 위한 과정을 기록해본다.
1. MySQL에 SEQUENCE
가 없는 이유
2. AUTO_INCREMENT
VS SEQUENCE
3. AUTO_INCREMENT
가 SEQUENCE
대체제가 될 수 없는 이유
4. SEQUENCE
를 사용하려는 이유
5. SEQUENCE
가 동시성과 병목현상을 어떻게 보장해주지?
6. SEQUENCE
의 한계, 단점은 없을까?
7. 하지만 SEQUENCE
하나 때문에 MariaDB를 선택해야 할까?
8. MySQL VS MariaDB
9. AUTO_INCREMENT
가 SEQUENCE
대체제가 될 수 있는 이유
10. MySQL을 사용해야 할 때
11. MariaDB을 사용해야 할 때
12. 결론
- mysql은 초창기부터 가벼운 데이터베이스로 설계되었다.
- 성능 최적화와 간단한 설계를 지향한다.
기능 | MySQL (AUTO_INCREMENT) | MariaDB (SEQUENCE) |
---|---|---|
테이블 종속 여부 | 테이블에 종속 | 독립적인 객체 |
값 범위 및 증분 | 제한적 설정 (START, INCREMENT) | 더 많은 옵션 (START, INCREMENT, MINVALUE, MAXVALUE, CYCLE 등) |
SQL 표준 준수 | 제한적 (SQL 표준과 다름) | SQL 표준 준수 |
다중 테이블에서 사용 | 복잡한 작업 필요 | 간단히 재사용 가능 |
- 트랜잭션 커밋 시점에 보장되는 auto_increment는 동시성, 병목 현상 발생시 값을 보장받지 못함
- Replication 환경에서 값 충돌 가능성
- auto_increment는 단일 데이터베이스에서 관리되는 값으로, 샤딩(Sharding)하거나 수평적 확장(Scale-Out) 할 때 고유성 유지 불가
- 분산 환경에서 중앙 집중화된 관리 포인트가 되어 확장성을 저하
- 동시성, 병목현상 발생시 값을 보장받지 못할 것이라 예상
- sequence는 SQL 표준 준수하기 때문에 sequence를 지원하지 않는 Mysql를 제외하면 DB 선택의 폭이 넓음
SEQUENCE
는 여러가지 방법을 통해 동시성과 병목현상으로부터 작업 결과를 보장받는다.
- 원자적 연산
- 중간에 끊기거나 부분적으로 실행할 수 없는 하나의 단위로써 완전하게 실행을 보장해주는 연산
- 전부 실행되거나, 전혀 실행되지 않는다
- 중간에 다른 연산이 끼어들 수 없다(Interrupt 불가)
- 시스템 장애나 동시 접근 상황에도 연산이 완전하게 보장
- 때문에 트랜잭션이 롤백이 되더라도 증가된 값은 유지된다
- INCREMENT 옵션
여러 노드에서 하나의 데이터베이스를 공유하는 클러스터 환경일 경우SEQUENCE
의 시작값, 증가값을 설정하여 병목을 감소
-- 1번 노드에서는 INCREMENT = 3, 시작값 1
-- 1번 노드에서 생성된 ID 값: ID 1, 4, 7, 10, ...
ALTER TABLE my_table AUTO_INCREMENT = 1;
SET @@auto_increment_increment = 3;
SET @@auto_increment_offset = 1;
-- 2번 노드에서는 INCREMENT = 3, 시작값 2
-- 2번 노드에서 생성된 ID 값: ID 2, 5, 8, 11, ...
ALTER TABLE my_table AUTO_INCREMENT = 2;
SET @@auto_increment_increment = 3;
SET @@auto_increment_offset = 2;
-- 3번 노드에서는 INCREMENT = 3, 시작값 3
-- 3번 노드에서 생성된 ID 값: ID 3, 6, 9, 12, ...
ALTER TABLE my_table AUTO_INCREMENT = 3;
SET @@auto_increment_increment = 3;
SET @@auto_increment_offset = 3;
- CACHE 옵션
- 시퀀스 값을 미리 캐싱하면 디스크 I/O(시퀀스 생성요청)를 줄이고 병목 현상을 감소시킬 수 있다
- 분산환경에서 ID 충돌 없이 사용이 가능하다
- NOORDER 옵션
- 클러스터 환경에서 순차적으로 증감시킬 때 INCREMENT 옵션을 활용하였지만 비순차적이여도 된다면 NOORDER 옵션 사용하여 병목을 감소시킬 수 있다
- 분산 환경 구축
- 샤딩
- 파티셔닝
- 데이터베이스가 재시작되면 cache 손실될 수 있다.
NO CACHE
를 쓰는 것도 방법이 될 수 있지만 성능이 저하될 수 있다. - 샤딩 환경 미지원하므로 분산 키 생성기와 병행하는 것이 좋다
- 단순한 ID 증가 방식이면
AUTO_INCREMENT
도 충분히 가능 - Sequence 관련 기능(
NEXTVAL
,CACHE
,CYCLE
등)이 필요하면 MariaDB가 적절
- MySQL은 InnoDB 엔진을 기반으로 트랜잭션 지원과 성능 최적화를 제공
- MariaDB는 일부 쿼리에서 성능이 더 좋거나 병렬 처리가 유리할 수도 있음
- MySQL은 오라클이 관리하는 공식 버전으로, 클라우드 서비스(AWS RDS, Google Cloud SQL 등)에서 널리 사용됨.
- MariaDB는 MySQL과 상당 부분 호환되지만, 특정 기능(예: JSON 함수, InnoDB 개선 사항 등)이 차이가 있음.
MySQL | MariaDB | |
---|---|---|
라이언스 및 개발 방향 | 오라클이 관리하며, 오픈소스(Community Edition)와 상용 버전이 존재 | MySQL에서 파생된 오픈소스, 오라클의 통제에서 벗어나 독립적으로 운영 |
기능 차이 | MySQL보다 더 다양한 스토리지 엔진(Aria, ColumnStore, Spider 등)을 지원 | JSON 지원, InnoDB 성능 최적화 등 일부 기능 지원 |
SEQUENCE 지원 여부 | SEQUENCE 객체가 없으나 대신 AUTO_INCREMENT 사용 | SEQUENCE , AUTO_INCREMENT 객체 지원 |
-
LAST_INSERT_ID()
를 사용하면 마지막으로 생성된 ID를 가져올 수 있다 - SEQUENCE의
NEXTVAL
과 비슷한 역할을 수행
-
AUTO_INCREMENT
는 InnoDB에서 트랜잭션과 함께 동작하며, 롤백하면 증가된 값도 무효화
- MySQL 5.6 버전에서부터 일부 동시성 문제 완화하기 위한 ‘innodb_autoinc_lock_mode’ 시스템 변수 도입
- MySQL 8.0 이후부터 ‘innodb_autoinc_lock_mode’의 기본값을 2로 변경함으로써 경량화된 래치(mutex) 기반으로 동시성 개선
- 래치(mutex)는 필요한 순간에만 잠깐 잠금을 걸고, 끝나면 바로 해제하는 방식이기 때문에 병렬로 실행 가능
- AWS RDS, GCP Cloud SQL과 같은 클라우드 서비스를 활용해야 할 때
- InnoDB의 최신 기능(예: 병렬 처리, JSON 함수)을 활용해야 할 때
- 기존 MySQL 기반 시스템과의 높은 호환성이 필요할 때
- SEQUENCE 없이도 AUTO_INCREMENT로 충분할 때
-
SEQUENCE
객체가 반드시 필요할 때 - MySQL과의 호환성을 유지하면서도 오픈소스 프로젝트를 선호할 때
- 다양한 스토리지 엔진 지원이 필요한 경우
- 일부 MariaDB의 성능 최적화 기능을 활용하고 싶을 때
- 단순히
SEQUENCE
하나 때문에 MariaDB를 선택하는 건 좋지 않음 - MySQL의
AUTO_INCREMENT
로 충분한 경우가 많음 - 하지만 SEQUENCE의 추가 기능(
CACHE
,CYCLE
등)이 필요하다면 MariaDB가 더 적절 - 최종적으로는 프로젝트의 요구사항과 데이터베이스의 전체적인 기능을 고려해서 결정하는 것이 중요
- 인터파크트리플(투어, 티켓, 트리플)은 Oracle, Mysql 계통 데이터베이스를 사용하고 있어서 sequence를 사용하고 있을 것이라 추측 및 MariaDB가 더 적절할 것이라 판단