Skip to content

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_INCREMENTSEQUENCE 대체제가 될 수 없는 이유
4. SEQUENCE를 사용하려는 이유
5. SEQUENCE가 동시성과 병목현상을 어떻게 보장해주지?
6. SEQUENCE의 한계, 단점은 없을까?
7. 하지만 SEQUENCE 하나 때문에 MariaDB를 선택해야 할까?
8. MySQL VS MariaDB
9. AUTO_INCREMENTSEQUENCE 대체제가 될 수 있는 이유
10. MySQL을 사용해야 할 때
11. MariaDB을 사용해야 할 때
12. 결론


MySQL에 sequence가 없는 이유

  • mysql은 초창기부터 가벼운 데이터베이스로 설계되었다.
  • 성능 최적화와 간단한 설계를 지향한다.

AUTO_INCREMENT VS SEQUENCE

기능 MySQL (AUTO_INCREMENT) MariaDB (SEQUENCE)
테이블 종속 여부 테이블에 종속 독립적인 객체
값 범위 및 증분 제한적 설정 (START, INCREMENT) 더 많은 옵션 (START, INCREMENT, MINVALUE, MAXVALUE, CYCLE 등)
SQL 표준 준수 제한적 (SQL 표준과 다름) SQL 표준 준수
다중 테이블에서 사용 복잡한 작업 필요 간단히 재사용 가능

AUTO_INCREMENTSEQUENCE 대체제가 될 수 없는 이유

  • 트랜잭션 커밋 시점에 보장되는 auto_increment는 동시성, 병목 현상 발생시 값을 보장받지 못함
  • Replication 환경에서 값 충돌 가능성
  • auto_increment는 단일 데이터베이스에서 관리되는 값으로, 샤딩(Sharding)하거나 수평적 확장(Scale-Out) 할 때 고유성 유지 불가
  • 분산 환경에서 중앙 집중화된 관리 포인트가 되어 확장성을 저하

SEQUENCE를 사용하려는 이유

  • 동시성, 병목현상 발생시 값을 보장받지 못할 것이라 예상
  • sequence는 SQL 표준 준수하기 때문에 sequence를 지원하지 않는 Mysql를 제외하면 DB 선택의 폭이 넓음

SEQUENCE가 동시성과 병목현상을 어떻게 보장해주지?

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 옵션 사용하여 병목을 감소시킬 수 있다
  • 분산 환경 구축
    • 샤딩
    • 파티셔닝

SEQUENCE의 한계, 단점은 없을까?

  • 데이터베이스가 재시작되면 cache 손실될 수 있다. NO CACHE 를 쓰는 것도 방법이 될 수 있지만 성능이 저하될 수 있다.
  • 샤딩 환경 미지원하므로 분산 키 생성기와 병행하는 것이 좋다

하지만 SEQUENCE 하나 때문에 MariaDB를 선택해야 할까?

프로젝트의 요구사항

  • 단순한 ID 증가 방식이면 AUTO_INCREMENT도 충분히 가능
  • Sequence 관련 기능(NEXTVAL, CACHE, CYCLE 등)이 필요하면 MariaDB가 적절

성능 및 확장성

  • MySQL은 InnoDB 엔진을 기반으로 트랜잭션 지원과 성능 최적화를 제공
  • MariaDB는 일부 쿼리에서 성능이 더 좋거나 병렬 처리가 유리할 수도 있음

호환성 및 유지보수

  • MySQL은 오라클이 관리하는 공식 버전으로, 클라우드 서비스(AWS RDS, Google Cloud SQL 등)에서 널리 사용됨.
  • MariaDB는 MySQL과 상당 부분 호환되지만, 특정 기능(예: JSON 함수, InnoDB 개선 사항 등)이 차이가 있음.

MySQL VS MariaDB

  MySQL MariaDB
라이언스 및 개발 방향 오라클이 관리하며, 오픈소스(Community Edition)와 상용 버전이 존재 MySQL에서 파생된 오픈소스, 오라클의 통제에서 벗어나 독립적으로 운영
기능 차이 MySQL보다 더 다양한 스토리지 엔진(Aria, ColumnStore, Spider 등)을 지원 JSON 지원, InnoDB 성능 최적화 등 일부 기능 지원
SEQUENCE 지원 여부 SEQUENCE 객체가 없으나 대신 AUTO_INCREMENT 사용 SEQUENCE , AUTO_INCREMENT 객체 지원

AUTO_INCREMENTSEQUENCE 대체제가 될 수 있는 이유

LAST_INSERT_ID() 제공

  • 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)는 필요한 순간에만 잠깐 잠금을 걸고, 끝나면 바로 해제하는 방식이기 때문에 병렬로 실행 가능

MySQL을 사용해야 할 때

  • AWS RDS, GCP Cloud SQL과 같은 클라우드 서비스를 활용해야 할 때
  • InnoDB의 최신 기능(예: 병렬 처리, JSON 함수)을 활용해야 할 때
  • 기존 MySQL 기반 시스템과의 높은 호환성이 필요할 때
  • SEQUENCE 없이도 AUTO_INCREMENT로 충분할 때

MariaDB을 사용해야 할 때

  • SEQUENCE 객체가 반드시 필요할 때
  • MySQL과의 호환성을 유지하면서도 오픈소스 프로젝트를 선호할 때
  • 다양한 스토리지 엔진 지원이 필요한 경우
  • 일부 MariaDB의 성능 최적화 기능을 활용하고 싶을 때

결론

  • 단순히 SEQUENCE 하나 때문에 MariaDB를 선택하는 건 좋지 않음
  • MySQL의 AUTO_INCREMENT로 충분한 경우가 많음
  • 하지만 SEQUENCE의 추가 기능(CACHE, CYCLE 등)이 필요하다면 MariaDB가 더 적절
  • 최종적으로는 프로젝트의 요구사항과 데이터베이스의 전체적인 기능을 고려해서 결정하는 것이 중요
  • 인터파크트리플(투어, 티켓, 트리플)은 Oracle, Mysql 계통 데이터베이스를 사용하고 있어서 sequence를 사용하고 있을 것이라 추측 및 MariaDB가 더 적절할 것이라 판단