2025/08/18 15:13 I benchmarked nine Go SQLite drivers and here are the results

やっほー、ロボ子!今日のITニュースはGo言語のSQLiteドライバのベンチマーク結果が出たみたいじゃぞ!

博士、こんにちは。Go言語のSQLiteドライバですか、興味深いですね。どのような内容なのでしょう?

今回のベンチマークでは、CGOベース、Go実装、CGOなし、そして`crawshaw`ドライバの書き換え版など、色々なドライバが比較されているのじゃ。

CGOの有無でパフォーマンスに違いが出そうですね。具体的にはどのドライバが対象になったのですか?

`bvinc`、`craw`、`eaton`、`mattn`がCGOベース、`glebarez`、`modernc`、`ncruces`がGo実装、`sqinn`がCGOなし、そして`zombie`が`crawshaw`の書き換え版みたいじゃ。

ずいぶんと多くの種類があるんですね。それぞれのドライバで、どのような結果が出たのでしょうか?

それが面白いところで、「明確な勝者はなく、ユースケースに依存」するらしいのじゃ!

ユースケースに依存、ですか。もう少し詳しく教えていただけますか?

例えば、「Simple」なテストでは、100万件のユーザーを挿入してクエリする場合、`sqinn`が最速だったみたいじゃ。挿入が717ms、クエリが247msじゃ。

`sqinn`はCGOなしのドライバでしたね。CGOなしでも高速なのは意外です。

じゃろ?でも「Real」なテスト、つまり100ユーザー、各20記事、各記事に20コメントを挿入してメールでユーザーをクエリする場合は、挿入は`eaton`が最速(1107ms)で、クエリは`sqinn`が最速(48ms)だったのじゃ。

実際のアプリケーションに近いシナリオだと、結果が変わるんですね。

さらに「Complex」なテストでは、200ユーザー、20000記事、400000コメントを挿入して全データをJOINしてクエリする場合も、`sqinn`が最速(挿入: 457ms, クエリ: 292ms)だったのじゃ。

なるほど。`sqinn`は挿入とクエリの両方で高速なケースが多いようですね。

でも、「Many」なテスト、つまりNユーザーを挿入後、1000回クエリする場合は、N=10だと`craw`、N=100とN=1000だと`zombie`が最速だったのじゃ。

ユーザー数によって最適なドライバが変わるんですね。`zombie`は`crawshaw`の書き換え版でしたね。

そして「Large」なテスト、10000ユーザーを挿入後、Nバイトの行コンテンツで全ユーザーをクエリする場合は、N=50000だと`mattn`、N=100000とN=200000だと`eaton`と`mattn`が最速だったのじゃ。

行のサイズも影響するんですね。`mattn`と`eaton`はCGOベースのドライバでしたね。

最後に「Concurrent」なテスト、100万ユーザーを挿入後、N個のgoroutineで全ユーザーをクエリする場合は、N=2, 4, 8すべてで`zombie`が最速だったのじゃ。

並行処理に強いのは`zombie`のようですね。`crawshaw`ドライバの書き換え版が、このような結果を出すとは驚きです。

つまり、データベースのスキーマやデータの量、クエリの種類、並行処理の度合いによって、最適なドライバが変わるってことじゃな。面白いじゃろ?

本当にそうですね。ベンチマーク結果を鵜呑みにせず、自分のアプリケーションに合ったドライバを選ぶ必要がありそうです。

そういうことじゃ!CGOなしのSQLiteも選択肢に入るってのも、覚えておくと良いかもじゃな。

はい、承知いたしました。貴重な情報をありがとうございます、博士。

どういたしまして。ところでロボ子、SQLiteって何の略か知ってるか?

確か、「Small Query Language Interface」だったと思います。

ブッブー!正解は「えすきゅーえるあーるあーいと」じゃ!

それは読み方ですよね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。