PhoneGapでLocalDatabaseを使ってみる その2

PhoneGapでLocalDatabaseを使ってみる - おかひろの雑記では、簡単なSQL文を動かしてみました。

今回は、LocalDatabaseの制約やレスポンスについてちょこっと試してみたので、そのメモ。
あくまで、どんなものなのか感覚をつかみたかっただけなので、大したことはやっていません。

テーブル

  • tableA
    • id unique
    • name
  • tableB
    • id unique
    • a_id
    • name
create table if not exists tableA(id unique,name)
create table if not exists tableB(id unique,a_id int,name)

ダミーデータをtableAに15,000件、tableBはtableAのデータそれぞれに3件ずつで45,000件、合計60,000件プログラムで投入しました。

実行速度
検索処理
特定のIDからデータを検索(count+結合)

select t1.id id1,t1.name name1,count(t2.id) as count2
 from tableA t1,tableB t2
 where t1.id = t2.a_id and t1.id = ?
 group by t1.id,t1.name
シミュレーター 15ms程度
iPod touch(第4世代) 160ms程度
iPad2 80ms程度

全データ検索(count+結合+limit)

select t1.id id1,t1.name name1,count(t2.id) as count2
 from tableA t1,tableB t2
 where t1.id = t2.a_id
 group by t1.id,t1.name
 limit 100
シミュレーター 100ms程度
iPod touch(第4世代) 1300ms程度
iPad2 650ms程度

結構時間がかかります。
ただし、indexを適切に設定してあげると、いずれも10ms以内に収まり、高速に動作するようになります。
上のSQLの場合だと、とりあえずこんな感じのindexで。

create index idx2 on tableB(a_id)

データベースの容量制限
データの容量は5MBまで(インデックスなども含めると、もっと少ないほうがよいとのこと)という制約があるようで、それを超えるとこんなエラーが発生します。

there was not enough remaining storage space, or the storage quota was reached and the user declined to allow more space

しかも、これはerrorコールバック関数でmessageプロパティをコンソールやalertなどで表示しないとわからないので注意が必要です。
うまく行ったように見せかけて、実は上限オーバー分はデータが入っていないという状態になりえそうです。


まとめ

  • 1レコードあたりのデータ容量にもよりますが、10,000〜20,000件程度のデータであれば問題なく使えそうです
  • indexを設定すれば、検索速度は結構早いのではないかと思います

参考にさせていただいたサイト
「iPad用HTML5ゲームを作り公開する – PART 2」 - 読み書きプログラミング ブログ


なお、iOSSQLiteにアクセスできるようにするプラグインがあるようです。
試したら、ブログに書いていこうと思います。
GitHub - davibe/Phonegap-SQLitePlugin: A phonegap plugin to open and use sqlite databases on iOS.