사용한 라이브러리들
- craw: CGO 기반 솔루션. database/sql 드라이버가 아님
- mattn: CGO 기반 솔루션. 여전히 de-facto standard 이고 많이 사용됨
- modernc: 순수 Go 솔루션. 새로운 라이브러리로 SQLite C 코드를 Go로 재작성한 코드 기반
- ncruces: WASM 기반의 순수 Go 솔루션
- sqinn: CGO를 사용하지 않은 솔루션. SQLite DB 파일을 접근하기 위해 github.com/cvilsmeier/sqinn 를 사용
- zombie: crawshaw 드라이버를 modernc 라이브러를 활용해서 재작성한 것. database/sql 드라이버가 아님
벤치마크
- user/article/comment로 구성된 테스트 DB를 생성
- 1백만 사용자 생성 및 조회
- insert : sqinn 883ms > craw 1234ms > mattn 1537ms > zombie 1862ms > modernc 5557ms > ncruces 10073ms
- query : zombie 325ms > craw 608ms > sqinn 641ms > mattn 1267ms > modernc 1379ms > ncruces 6080ms
- 복잡한 쿼리: 한 트랙잰션에서 200 사용자 생성, 또다른 트랜잭션으로 각 사용자당 100 아티클 생성, 또 다른 트랜잭션으로 아티클당 20 코멘트 생성. 모든 것을 JOIN 해서 쿼리
- insert : sqinn 574 > craw 729ms > mattn 911ms > zombie 1400ms > modernc 3211ms > ncruces 5159ms
- query : zombie 507ms > craw 667ms > sqinn 709ms > mattn 1387ms > modernc 1633ms > ncruces 5380ms
Here are the remaining sections of the "go-sqlite-bench" GitHub repository summary in the requested format:
- 많은 조회(Many) : N명의 사용자를 하나의 데이터베이스 트랜잭션에 삽입한 다음, 1000번 조회
- query/N=10 : zombie 17ms > craw 14ms > sqinn 25ms > mattn 30ms > modernc 35ms > ncruces 185ms
- query/N=100 : zombie 36ms > craw 65ms > sqinn 83ms > mattn 130ms > modernc 135ms > ncruces 829ms
- query/N=1000 : zombie 225ms > craw 520ms > sqinn 619ms > mattn 1143ms > modernc 1180ms > ncruces 7230ms
- 대용량 데이터(Large) : 10,000명의 사용자와 N 바이트의 행 내용을 삽입한 다음, 모든 사용자 조회
- query/N=50000 : mattn 168ms > craw 197ms > ncruces 244ms > modernc 276ms > zombie 552ms > sqinn 519ms
- query/N=100000 : mattn 290ms > craw 346ms > ncruces 391ms > modernc 514ms > zombie 1071ms > sqinn 1085ms
- query/N=200000 : mattn 591ms > craw 624ms > ncruces 789ms > modernc 888ms > zombie 2198ms > sqinn 2264ms
- 동시성(Concurrent) : 100만 명의 사용자를 삽입한 후, N개의 고루틴으로 모든 사용자 조회
- query/N=2 : zombie 367ms > craw 692ms > sqinn 854ms > mattn 1516ms > modernc 2889ms > ncruces 8268ms
- query/N=4 : zombie 646ms > craw 1100ms > sqinn 1411ms > mattn 1840ms > modernc 7144ms > ncruces 12710ms
- query/N=8 : zombie 1140ms > craw 1873ms > sqinn 2460ms > mattn 3483ms > modernc 18674ms > ncruces 25792ms
요약
- 우열을 가릴 수는 없으며, 모든 것이 유스 케이스에 따라 다름
- Crawshaw 와 Zombiezen이 꽤 빠름
- Mattn이 사실상의 표준이긴 하지만 전반적으로 최고의 솔루션은 아님
- CGO가 없는 SQLite도 가능함