【JS応用|初心者向け】ブラウザで大量データを高速検索!IndexedDBのIDBIndex活用術

1. 導入: なぜIDBIndexが必要なのか

Webアプリで「ブラウザ上にデータを保存したい」と考えたとき、localStorageは便利ですが、容量制限や検索の遅さがネックになります。そこで登場するのがIndexedDBです。しかし、IndexedDBはデータを探すのが少し大変です。そんな時、特定のキーで高速に検索を可能にするのがIDBIndexです。これを使うことで、大量のデータから目的の項目を一瞬で見つけ出し、快適なユーザー体験を実現できます。

2. 基礎知識: IDBIndexとは?

IndexedDBは「オブジェクトストア」という箱にデータを入れます。通常、検索は「プライマリキー(IDなど)」でしか行えません。しかし、IDBIndexを使うと、氏名やメールアドレスなど、別の属性に対しても「インデックス(索引)」を張ることができます。本棚に例えるなら、プライマリキーが「本の管理番号」、IDBIndexが「著者の名前順リスト」のような役割を果たします。これにより、番号を知らなくても著者名で素早く本を探せるようになるのです。

3. 実装/解決策: インデックスの作成手順

IDBIndexを作成するタイミングは、データベースのバージョンアップ時(onupgradeneededイベント)に限られます。
1. データベースを開く。
2. バージョンアップ時にcreateObjectStoreでストアを作成。
3. 作成したストアに対してcreateIndexメソッドを呼び出し、検索したいプロパティを指定する。

4. サンプルプログラム: ユーザー名で検索する例

以下のコードは、ユーザー名(name)にインデックスを張り、特定の名前のユーザーを探すサンプルです。

// 1. データベース接続を開く
const request = indexedDB.open("MyDatabase", 1);

// 2. データベースの初期設定(インデックス作成)
request.onupgradeneeded = (event) => {
  const db = event.target.result;
  // 'users'という名前のストアを作成し、'id'をキーにする
  const store = db.createObjectStore("users", { keyPath: "id" });
  
  // 'name'プロパティに対してインデックスを作成(重複を許可しない場合はunique: true)
  store.createIndex("nameIndex", "name", { unique: false });
};

// 3. データの検索を実行
request.onsuccess = (event) => {
  const db = event.target.result;
  const transaction = db.transaction("users", "readonly");
  const store = transaction.objectStore("users");
  
  // インデックスを使って検索
  const index = store.index("nameIndex");
  const searchRequest = index.get("山田太郎");

  searchRequest.onsuccess = () => {
    console.log("見つかったデータ:", searchRequest.result);
  };
};

5. 応用・注意点: 現場で役立つポイント

注意点1: インデックスは後から追加できない
一度作成したデータベースの構造(インデックス)を変えるには、バージョン番号を上げて再構築する必要があります。設計段階でどのデータで検索するかをしっかり計画しましょう。

注意点2: 大量データでのパフォーマンス
IDBIndexは非常に高速ですが、インデックスを増やしすぎるとデータの書き込み速度が低下します。本当に検索が必要な項目だけに絞って作成するのが、パフォーマンス維持のコツです。

ヒント: 範囲検索も可能
IDBKeyRangeというオブジェクトと組み合わせれば、「Aから始まる名前の人」といった範囲指定での検索も可能です。応用範囲が広いので、ぜひ組み合わせて使ってみてください。

タイトルとURLをコピーしました