【问题标题】:iOS SQLite search. Speed issuesiOS SQLite 搜索。速度问题
【发布时间】:2011-12-09 21:44:48
【问题描述】:

我的应用目前具有搜索书籍的搜索功能。注意:搜索操作一次只搜索一本书。

问题是随着下载书籍数量的增加,它变得非常缓慢。基本上,“pages”数据库表中有一个字段,其中包含书籍的文本内容。它被设置为索引。

这是我正在使用的查询:

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 会以任何方式提高查询速度吗?另外,我在这里只搜索一本书,但是如果表中还有属于其他书籍的页面,是否会影响速度?

或者,搜索这么多内容是否很耗时?

提前感谢您对此的任何想法。

--康纳

【问题讨论】:

  • A LIKE '%?%' 将需要搜索表中的每条记录,至少对每一行进行字符串比较和记录检索。除了这个条款,你能做的任何事情都会更好——FTS、自定义标记、..

标签: sql objective-c ios sqlite full-text-search


【解决方案1】:

乍一看,尝试删除不必要的子查询和重复的“ORDER BY”语句。 “LIKE”语句也非常耗时(在许多情况下应尽可能避免,除非只处理小字符串);看看您是否可以更改该条件,以便不必检查该文本字段中的每个字符序列。您还可以添加一些其他条件来减少 like 语句必须检查的数据子集。

另一种技术是对内容进行自己的索引。列上的数据库索引实际上只适用于完全匹配,而不适用于字符序列搜索。因此,请尝试在代码中进行自己的索引,方法是在将内容添加到数据库时对其进行解析,并使用这些常用词、短语或字符序列创建另一个表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2015-09-08
    • 2019-08-02
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多