使用したライブラリ
- craw: CGOベースのソリューション。
database/sqlドライバではない
- mattn: CGOベースのソリューション。依然として事実上の標準であり、広く使われている
- 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を生成
- 100万人のユーザーを生成して取得
- 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
- 複雑なクエリ: 1つのトランザクションで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人のユーザーを1つのデータベーストランザクションに挿入した後、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個のgoroutineですべてのユーザーを取得
- 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も可能
まだコメントはありません。