Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone sqlite索引性能建议_Iphone_Sqlite_Search_Indexing - Fatal编程技术网

Iphone sqlite索引性能建议

Iphone sqlite索引性能建议,iphone,sqlite,search,indexing,Iphone,Sqlite,Search,Indexing,我的iPhone应用程序中有一个sqlite数据库,我可以通过核心数据框架访问该数据库。我正在使用NSPredicates查询数据库 我正在构建一个搜索函数,它需要搜索六个不同的包含文本的varchar字段。目前,速度非常慢,我需要提高性能,可能是在sqlite数据库中。最好在所有这些列上创建索引吗?还是构建一个自定义索引表更好,将这六列扩展为多行,每行包含一个单词及其匹配的ID?还有其他建议吗?您可以做一些事情来提高在sqlite数据库中搜索文本的性能。尽管核心数据将您从底层存储中抽象出来,但

我的iPhone应用程序中有一个sqlite数据库,我可以通过核心数据框架访问该数据库。我正在使用NSPredicates查询数据库


我正在构建一个搜索函数,它需要搜索六个不同的包含文本的varchar字段。目前,速度非常慢,我需要提高性能,可能是在sqlite数据库中。最好在所有这些列上创建索引吗?还是构建一个自定义索引表更好,将这六列扩展为多行,每行包含一个单词及其匹配的ID?还有其他建议吗?

您可以做一些事情来提高在sqlite数据库中搜索文本的性能。尽管核心数据将您从底层存储中抽象出来,但当您的存储使用sqlite进行备份时,了解发生了什么是一件好事


如果我们假设您正在对这些字段进行子字符串搜索,那么您可以做一些事情来提高搜索性能。苹果公司建议使用派生属性。这相当于在模型中维护用于搜索的属性的标准化版本。派生属性应该以可以索引的方式进行。然后使用二进制运算符来表示这个派生属性的搜索>我假设这些列存储文本。问题是有多少文本以及访问此模型的频率。如果是大量文本,我会创建保存文本的其他属性,剥离常用词和Unicode文本。唯一的缺点是,您最终需要维护额外的属性。您可以执行任何索引来提高这些列的性能

如果您想要的基本上是sqlite db的全文索引,那么您可能需要使用sqlite的ft3模块,因为这正是它提供的:

来自:

如何使用谓词可以 显著影响绩效 你的申请。如果有人来取 请求需要一个复合谓词, 您可以提高提取效率 通过确保最严格的 谓词是第一个,尤其是在 谓词涉及文本匹配 (包含、结束、类似和 匹配项)自正确的Unicode 搜索很慢。如果谓词 结合文本和非文本 比较,那么它很可能是 更有效地指定 首先是非文本谓词,例如 示例(工资>5000000)和 (姓昆西)更好 比(姓“昆西”)和 (工资>5000000)


如果有一种方法可以对查询进行重新排序,使最简单的逻辑在左边,最复杂的逻辑在右边,这将有助于提高搜索性能。正如Lyon所建议的,搜索Unicode文本非常昂贵,因此苹果公司建议搜索带有Unicode字符和常用短语(如a、and和)的派生值。

您的问题令人困惑。如果您使用的是核心数据,则永远不会直接访问SQLite数据库。像“varchar”和“table”这样的词在核心数据中没有任何意义。您应该修改您的问题,以澄清您是否实际使用了核心数据,或者您只是使用了一个普通的旧SQLite数据库。谢谢您的评论,Alex,我已经更新了我的问题。我从来没有在代码中直接访问过sqlite数据库,但我可以在xcode背后访问。例如,我使用sqlite3命令行程序在数据库中植入了数据。今晚我将查看该示例。我还需要阅读派生属性。谢谢你的提示。是的,他们确实储存文字。。。我更新了我的问题以反映这一点。我有大约500行,六列中的每一列平均有五个单词。我总共搜索了大约3000个单词。我只是不清楚在sqlite中索引是如何工作的。我需要仔细阅读。@mswebersd:如果您的数据库只有500行,我很好奇会发生什么,您称之为“非常慢”。不管它是否被索引,那个大小的表上的查询都应该几乎是即时的。具体执行什么样的SQL?((名称包含[cd]]@)或(颜色包含[cd]]@)或(…)和((名称包含[cd]@)或(颜色包含[cd]@)或(…)和(…)吨ORs并包含[cd]。它在表上使用UISearchBar,每当用户键入字母并且字符串长度大于0时,搜索都会运行。哦,还有一件事。。。我忘了提到每个或短语代表一个单词(我在空格字符上分开)。所以AND连接了多个单词。我可能能提取出常用单词,但可能不行。我认为用户永远不会输入数字。我的查询字符串效率极低,使用了以下内容:((名称包含[cd]]@)或(颜色包含[cd]@)或(…)和((名称包含[cd]@)或(颜色包含[cd]@)或(…)和(…)吨ORs。如果sqlite和我使用过的其他数据库一样,那么这是一种非常缓慢的搜索方式。老实说,也许解决方案比这一切都简单。也许我只需要在用户单击“搜索”时响应,而不是每次他们键入字母时响应?您仍然可以通过搜索去掉unicode字符的派生属性而不受惩罚。单凭这一点就可以显著提升性能。CoreData支持FTS3吗?这可能就是为什么我应该在这篇文章的标题中留下CoreData。不过我会调查的。