# go-mysql-server - MySQL과 호환되는 순수 Go 언어로 작성된 데이터베이스 엔진

> Clean Markdown view of GeekNews topic #14251. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14251](https://news.hada.io/topic?id=14251)
- GeekNews Markdown: [https://news.hada.io/topic/14251.md](https://news.hada.io/topic/14251.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-04-10T23:34:48+09:00
- Updated: 2024-04-10T23:34:48+09:00
- Original source: [github.com/dolthub](https://github.com/dolthub/go-mysql-server)
- Points: 6
- Comments: 1

## Topic Body

- 순수 Go로 작성된 MySQL 호환 데이터베이스 엔진  
- 데이터 소스에 구애받지 않는 SQL 엔진이며, MySQL 문법과 프로토콜을 사용해 제공된 데이터 소스에 대해 쿼리를 실행  
- 간단한 인-메모리 데이터베이스 구현체가 포함되어 있으며, 자체 백엔드를 구현해 원하는 데이터 소스를 쿼리할 수 있음  
  
### 호환성  
- 특정 제한 사항을 제외하고는 go-mysql-server는 MySQL의 대체재로 사용할 수 있음  
- MySQL에서 작동하는 클라이언트 라이브러리, 도구, 쿼리, SQL 문법, SQL 함수 등이 go-mysql-server에서도 작동해야 함  
- 기능 차이가 발견되면 이슈 제보 바람   
  
### 프로젝트 범위  
- 데이터 소스를 쿼리하기 위한 SQL 서버 및 엔진  
- 테스트에 사용하기 적합한 인-메모리 데이터베이스 백엔드 구현  
- 자체 데이터 소스를 쿼리하기 위한 새로운 백엔드 구현에 사용할 수 있는 인터페이스  
- 몇 가지 주의사항을 고려하고 전체 데이터베이스 구현을 사용한다면 MySQL 데이터베이스를 대체할 수 있음  
  
### go-mysql-server의 주요 사용 사례:  
1. 내장된 `memory` 데이터베이스 구현을 사용해 Go 테스트 환경에서 MySQL을 대신함  
2. 몇 가지 인터페이스를 구현해 임의의 데이터 소스에 SQL 쿼리로 접근할 수 있게 함  
  
### 인-메모리 테스트 서버 사용  
- 인-메모리 테스트 서버는 테스트에서 실제 MySQL 서버를 대체할 수 있음  
- 제공된 예제 코드를 사용해 서버를 시작할 수 있음  
- 서버가 실행되면 MySQL 클라이언트나 Go MySQL 커넥터, `mysql` 쉘 등으로 접속 가능  
  
### 인-메모리 데이터베이스 구현의 제한사항  
- 동봉된 인-메모리 데이터베이스 구현은 테스트용으로 사용하기 위한 것임  
- 알려진 제한사항:  
  - 스레드 안전하지 않음. 동시성 문제를 피하려면 DDL과 DML 문을 단일 고루틴으로 제한해야 함  
  - 트랜잭션을 지원하지 않음. `START TRANSACTION`, `ROLLBACK`, `COMMIT` 등의 문은 작동하지 않음   
  - 비효율적인 인덱스 구현. 인덱스 조회와 조인은 내부 테이블에 대해 전체 테이블 스캔을 수행함  
  
### 사용자 정의 백엔드 구현  
- 일부 인터페이스를 구현해 자체 데이터 소스를 쿼리하는 백엔드를 만들 수 있음  
- 자세한 지침은 백엔드 가이드 참조  
  
### go-mysql-server로 구동되는 프로젝트  
- dolt  
- gitbase(중단됨)  
- go-mysql-server로 데이터베이스 백엔드를 구축 중이라면 알려주기 바람  
  
### 라이선스  
- Apache License 2.0  
  
### GN⁺의 의견  
- go-mysql-server는 Go로 작성된 가벼운 MySQL 호환 데이터베이스 엔진으로, 테스트 환경에서 MySQL을 대체하거나 자체 데이터 소스를 SQL로 쿼리하는 용도로 유용해 보임  
- MySQL 호환성을 목표로 하므로 기존 MySQL 기반 애플리케이션을 크게 수정하지 않고도 적용할 수 있을 것으로 기대됨  
- 다만 아직 실험적인 프로젝트이며, 특히 인-메모리 구현은 테스트용에 그치므로 프로덕션 적용 시에는 성능과 안정성 면에서 주의가 필요해 보임  
- 백엔드 개발자라면 인터페이스를 직접 구현해 원하는 데이터 소스를 연결할 수 있다는 점이 매력적일 것임. Dolt와 같은 실제 프로젝트 사례를 참고하면 좋겠음  
- 비슷한 MySQL 호환 데이터베이스로는 TiDB, CockroachDB 등이 있음. go-mysql-server는 이들과 달리 백엔드를 자유롭게 구현할 수 있다는 장점이 있지만, 반대로 백엔드 개발에 추가 비용이 든다는 단점도 있음

## Comments



### Comment 24346

- Author: neo
- Created: 2024-04-10T23:34:48+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=39983490) 
* Dolt를 구동하는 쿼리 엔진으로서 go-mysql-server가 가장 중요함
* Dolt의 대부분 코드를 작성했지만 원 저자는 아님. 프로젝트 시작 배경 스토리가 흥미로움
* Dolt의 아이디어가 매력적이지만, 너무 다르고 중요한 persistence layer여서 비즈니스 구축에는 부족함. 하지만 주류 DB들이 채택하면 좋겠음
* MySQL에서 PostgreSQL, SQLite로의 지원이 발전되면 WordPress 등에서 다중 DB 엔진 지원이 가능해질 것임
* MySQL에서 SQL로의 wire-protocol proxy로 보임. 기본 proxied DB는 Dolt이며, Dolt에서 추출된 것으로 추측됨
* Go가 더 나을 수 있지만, C# 개발자 입장에서는 GC 언어로 DB 구현하는 것이 우려됨. GC와 싸우고 많은 non-obvious low allocation 코드를 작성해야 할 것임. 소규모 팀에는 괜찮을 수 있으나 적합한 기술을 가진 개발자 영입이 어려울 것임
* 호환성과 기능이 매우 제한적이어서 프로덕션에서 사용하기 어려움 (트랜잭션 미지원, 비효율적 인덱스 구현 등). 트리거, 저장 프로시저 등의 지원 여부도 궁금함
* Rails 프로젝트 테스트를 위해 MySQL의 in-memory 대체재로 사용하는 것이 얼마나 어려울지 궁금함. DB 계층이 중요하므로 프로덕션에서는 주의해야 하지만, 테스트 속도를 높일 수 있다면 흥미로울 것임
* TiDB는 Go와 Rust로 작성된 분산형 MySQL 호환 DB이며, StarRocks는 Java와 C++로 작성된 OLAP용 MySQL 호환 DB임. 하지만 이 프로젝트는 다른 관점을 다루는 것 같음. Vitess MySQL 라이브러리 사용이 어려우므로 ORM 같은 추상화 계층 구축에 사용될 수 있을지도 모름
* 이런 구현들을 보면 놀랍지만, 실제 사용처가 있을지는 의문임
* MySQL 대신 표준 SQL을 준수하는 것은 어떨지 제안함
