2011-06-20 11 views
1


私は現在、最大のものが10,000行以上あるテーブルがほとんどないsqlite dbを持っています。この表には、ID、用語、定義、カテゴリの4つの列があります。私はFTS3モジュールを使って検索のスピードアップを図りました。しかし、今、テーブルから '次の'または '前の'行をフェッチしようとすると、FTS3を使用する前よりも時間がかかります。Android:SQLite FTS3は次/前の行をフェッチするときに遅くなります

これは私が仮想テーブルを作成する方法である:

CREATE VIRTUAL TABLE profanity USING fts3(_id integer primary key,name text,definition text,category text); 

これは私が次/前の行をフェッチする方法である:

SELECT * FROM dictionary WHERE _id < "+id + " ORDER BY _id DESC LIMIT 1 
SELECT * FROM dictionary WHERE _id > "+id + " ORDER BY _id LIMIT 1 

私は仮想テーブルの上にこれらのステートメントを実行すると:

  • NEXT用語は〜300ms以内
  • 前期は、私は通常のテーブル(FTS3せずに作成したもの)でそれを行うと〜200msの

内フェッチです:

  • 次期〜3msの
  • 内フェッチされます
  • 前期は〜2msのなぜそこ

以内にフェッチされますそんなに大きな違いはありますか?このスピードを改善できる方法はありますか?

編集済み:
まだ動作しません。

答えて

0

作成した仮想テーブルはフルテキストクエリを提供するように設計されていますが、PKを使用して標準クエリを高速処理することは目的ではありませんition。 この場合、_id列にインデックスがないため、SQLiteはおそらくフルテーブルスキャンを実行します。 次の問題はあなたの質問です。それは完全に非効率です。次のようなものを試してみてください(未テスト)。

SELECT * FROM dictionary WHERE _id = (select max(_id) from dictionary where _id < ?) 

次はあなたのアプリのデザインを変更することです。あなたは1行を読み込む代わりに、たぶんあなたは40と言って、それらをメモリにロードし、バックグラウンドデータのロードがnの端に1未満であるときに行うべきです。長いSQL操作は0,3秒の代わりに3秒続く場合でもユーザーには見えなくなります

0

LIMIT 1を実行している場合は、order by句を完全に削除できます。これは役に立ちます。しかし、私はFTS3に精通していません。

また、単にフラットアウトあなたのid変数++または割り当てることができます - とWHERE _id =「+ ID +」の代わり<かの単一のルックアップ>になるだろうLIMIT 1"

編集 `主張しています。あなたの_idがあなたのpkであり、ユニークでなければならないので、あなたがそのようにすれば、あなたはLIMIT 1を完全に削除することができます。

ちょっと見て、生のwhere節!

+0

お返事ありがとうございます。私はすでにあなたが言ったことを試しています(最初にIDを減らしたり増やしたりしてデータを取得します)。改善がありますが、フィルタを追加しても機能しません(特定のカテゴリに属する​​用語を取りたい場合)。私はまた、FTS3のWHERE _id MATCH '10' 'が' WHERE _id = 10 'よりもはるかに高速であることを確認しました。 – Marqs

関連する問題