12月11日、RustでSQLiteを一から実装し直したプロダクト「Limbo」が海外で話題になっている。
Limboは、SQLiteの完全なリライトを目指すTursoの新たな実験的プロジェクトである。SQLiteの堅牢な機能を継承しつつも、メモリ安全性やモダンなアーキテクチャを実現することを目指している。このプロジェクトは、GitHubのリポジトリで公開されており、オープンソースとして開発が進められている。
Limboの背後にある動機は、SQLiteの開発における制約を解消するためだ。SQLiteはC言語で書かれており、メモリ安全性の問題があるほか、非同期I/Oのサポートが限定的だった。Limboはこれらの課題を解決し、Rustのメモリ安全性と非同期処理を活用して、よりモダンで堅牢なデータベースを実現しようとしている。
Limboの主要な特徴
1. 完全な非同期I/Oのサポート
Limboは完全に非同期のI/O処理をサポートしている。SQLiteの標準インターフェースは同期的であるため、非同期処理を実現するためにはスレッドを利用する必要があった。これに対し、Limboは非同期I/O APIであるio_uring
を活用し、sqlite3_step
の呼び出し自体が非同期化されている。
これにより、大量のデータ集約処理やネットワーク越しのクエリ実行時に、より効率的な動作が可能になる。
2. WASM対応
Limboは、WebAssembly (WASM) への対応を最初から考慮して設計されている。SQLiteもWASMに移植されているが、Limboは最初からWASM環境での動作を前提としている。
そのため、Drizzle ORMなどのツールと連携して、次のようなコードでブラウザ内データベース操作が可能である。
import { drizzle } from 'drizzle-orm/better-sqlite3';
import * as s from 'drizzle-orm/sqlite-core';
import { Database } from 'limbo-wasm';
const sqlite = new Database('sqlite.db');
const db = drizzle({ client: sqlite });
const users = s.sqliteTable("users", {
id: s.integer(),
name: s.text(),
});
const result = db.select().from(users).all();
console.log(result);
このコードは、ブラウザ上でSQLiteライクなデータベース操作を可能にしており、Webアプリケーション開発の新たな可能性を提供している。
3. パフォーマンスの向上
Limboは、SQLiteに比べてすでにいくつかのクエリで高いパフォーマンスを実現している。例えば、 SELECT * FROM users LIMIT 1
というクエリでは、SQLiteの620ナノ秒に対し、Limboでは506ナノ秒で処理が完了する。これは約20%のパフォーマンス向上を示している。
このパフォーマンス向上の要因は、非同期I/Oの活用や、モダンな設計思想の導入によるものだと考えられている。
4. シンプルな設計
SQLiteは、長年の進化の中で多くの設定項目が追加され、最適なパフォーマンスを得るための設定が複雑化していた。これに対し、Limboは不要な機能を排除し、現代的な環境に最適化された設計を採用している。
例えば、SQLiteで求められる「WALモードへの切り替え」や「POSIXロックの無効化」などの操作が不要で、デフォルトの状態でも高いパフォーマンスが得られる設計になっている。
まとめ
Limboは、SQLiteの持つ信頼性やパフォーマンスを維持しつつ、非同期I/O、WASM対応、モダンなアーキテクチャを導入している。今後の進展が注目される。
詳細はIntroducing Limbo: A complete rewrite of SQLite in Rustを参照していただきたい。