2011-10-18 8 views
1

私のアプリは現在、書籍を検索する検索機能を備えています。注:検索操作は、一度に1つのブックのみを検索します。iOS SQLite検索。スピードの問題

問題は、ダウンロードした書籍の数が増えるにつれて非常に遅くなることです。基本的に、書籍のテキストコンテンツを含むフィールドが「ページ」dbテーブルにあります。インデックスとして設定されます。

SELECT * FROM (
    SELECT 
     page_num, content 
    FROM 
     offline_pages 
     JOIN offline_chapters ON offline_chapters.uid = offline_pages.offline_chapters_uid 
     JOIN offline_books ON offline_books.uid = offline_chapters.offline_books_uid 
    WHERE 
     offline_books_uid = ? 
     AND 
     content LIKE '%?%' 
    ORDER BY 
     page_num 
) AS temp 
ORDER BY temp.page_num 
LIMIT 30 

ユーザーはまだ図書の数が増加するにつれて、検索機能について訴えている。ここで

は、私が使用しているクエリです。私はこのクエリがかなり重いことを認識していますが、それを改善する方法はありますか?

私は以前より良い結果を得る方法として、SQLiteのFTSモジュールを探していました。FTSはどのようにしてもクエリの速度を向上させるでしょうか?また、私はここで一つの本を検索しているだけですが、テーブルに他の書籍に属するページもあるとスピードに影響しますか?

または、この量のコンテンツを検索するのは時間がかかりますか?

ありがとうございました。

--Conor

+0

'LIKE '%?%''は、テーブル内のすべてのレコードを検索する必要があります。少なくとも各行の文字列比較とレコード検索が必要です。この句以外にできることは、FTS、カスタムタギング、などです。 –

答えて

1

は、一見すると、不要な副問合せと文の重複 "BY ORDER" を削除してみてください。 "LIKE"ステートメントも非常に時間がかかります(小さな文字列を扱う以外は可能な限り避けるべきです)。その条件を変更して、そのテキストフィールド内のすべての文字シーケンスをチェックする必要がないかどうかを確認してください。同様の文がチェックしなければならないデータのサブセットを減らすために、いくつかの条件を追加することもできます。

別の方法として、コンテンツの独自のインデックス作成を行う方法があります。列のデータベースインデックスは、実際には文字シーケンス検索ではなく完全一致にのみ適しています。したがって、データベースに追加されているコンテンツを解析し、それらの一般的な単語、フレーズ、または文字シーケンスで別のテーブルを作成することで、コード内で独自のインデックス作成を実行してみてください。