10月16日、RxDBが「LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite」と題したドキュメントを公開した。この記事では、ブラウザ内でデータを格納・クエリするためのさまざまな技術について詳しく紹介されている。
以下に、その内容を紹介する。
ストレージ系APIの概要
1. Cookies
Cookiesは主にセッション管理やパーソナライゼーション、トラッキングに使用される、小規模なキーバリューデータを格納するための技術だ。1994年にNetscapeによって導入され、全てのHTTPリクエストと共にサーバーに送信されるため、格納できるデータは限られている。また、最近ではChromeによるShared Memory Versioningや非同期のCookieStore APIなど、パフォーマンスの向上も図られている。
2. LocalStorage
LocalStorageは2009年にWebStorage仕様の一部として提案され、ブラウザに小規模なキーバリューペアを格納するためのAPIだ。主に5MBまでのデータを格納でき、セッションを超えてデータを保持する。APIはシンプルで、setItem、getItem、removeItem、clearの4つのメソッドを備えているが、非同期ではないため、重い操作を行うとUIがブロックされる。
3. IndexedDB
IndexedDBは、2015年に導入された低レベルのAPIで、大量の構造化されたJSONデータを格納するために使用される。非同期操作が可能で、インデックスを利用してデータの検索が行えるが、複雑なクエリをサポートしていない。また、IndexedDB 2.0以降のバージョンでは、getAll()メソッドの導入により、パフォーマンスが大幅に向上している。
4. OPFS (Origin Private File System)
OPFSは、バイナリデータをブラウザに格納するための新しいAPIで、大規模なデータ操作を想定している。OPFSは、主にライブラリ開発者向けに設計されており、通常のWebアプリケーションではあまり使用されないが、ファイルベースのデータ管理に適している。
5. WASM-SQLite
WASM (WebAssembly)を使用してSQLiteをブラウザ内で実行する技術で、ブラウザでネイティブのデータベースに近いパフォーマンスを発揮できる。SQLiteのバイトコードをWASMとしてブラウザにロードし、IndexedDBなどと連携してデータを格納する方法が一般的だが、WASMの特性上、初回ロードには約500msの時間がかかる。
パフォーマンスの比較
それぞれのストレージAPIの初期化時間、読み書きのレイテンシー、バルク操作のパフォーマンスを比較する。
初期化時間
まず、各APIの初期化時間を比較する。LocalStorageとCookiesは初期化が不要で即座に使用可能だが、IndexedDBやWASM-SQLiteはデータベースや仮想ファイルシステムの準備に時間がかかる。
技術 | 初期化時間(ミリ秒) |
---|---|
IndexedDB | 46 |
OPFSメインスレッド | 23 |
OPFS WebWorker | 26.8 |
WASM-SQLite(メモリ) | 504 |
WASM-SQLite(IndexedDB) | 535 |
小規模書き込みのレイテンシー
多くの小規模なデータを書き込む場合のレイテンシーを比較する。
技術 | 書き込み時間(ミリ秒) |
---|---|
Cookies | 0.058 |
LocalStorage | 0.017 |
IndexedDB | 0.17 |
OPFSメインスレッド | 1.46 |
OPFS WebWorker | 1.54 |
WASM-SQLite(メモリ) | 0.17 |
WASM-SQLite(IndexedDB) | 3.17 |
大量のデータ操作
200件のデータを一度に書き込む場合のパフォーマンスも比較する。
技術 | 書き込み時間(ミリ秒) |
---|---|
Cookies | 20.6 |
LocalStorage | 5.79 |
IndexedDB | 13.41 |
OPFSメインスレッド | 280 |
OPFS WebWorker | 104 |
WASM-SQLite(メモリ) | 19.1 |
WASM-SQLite(IndexedDB) | 37.12 |
読み込みパフォーマンス
100件のデータを一度に読み込む際のパフォーマンスも検証されている。
技術 | 読み込み時間(ミリ秒) |
---|---|
Cookies | 6.34 |
LocalStorage | 0.39 |
IndexedDB | 4.99 |
OPFSメインスレッド | 54.79 |
OPFS WebWorker | 25.61 |
WASM-SQLite(メモリ) | 3.59 |
WASM-SQLite(IndexedDB) | 5.84(キャッシュなし時35ms) |
まとめ
記事では、各ストレージAPIの特性を踏まえ、具体的な利用シナリオでの選択肢が提示されている。たとえば、LocalStorageは高速だが小規模データに限られ、IndexedDBは大規模データを扱えるものの、APIの複雑さが難点だ。OPFSやWASM-SQLiteは、パフォーマンスが高いが設定に時間がかかる。
詳細はLocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLiteを参照していただきたい。
How can IndexedDB's performance and usability be further optimized, particularly in terms of complex query execution and large-scale data Block Blast operations, without compromising its offline capabilities and data integrity?