热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Sqlite+80K行+LIKE=键盘滞后-Sqlite+80Krows+LIKE=keyboardlag

IvehadthisproblemthatIhavebeenputtingoffsolving,butnowisthetime.我有这个问题,我一直推迟解决,但现在是

I've had this problem that I have been putting off solving, but now is the time.

我有这个问题,我一直推迟解决,但现在是时候了。

I have a basic dictionary program. It has a UISearchBar and a UITableView. It works the way that it should except when running on the device it causes Keyboard lag. (Simulator is fine, of course) I have two types of searching. As-you-type and On-return. I find that both take about the same amount of time to return results, but the As-you-type makes the keyboard lag.

我有一个基本的字典程序。它有一个UISearchBar和一个UITableView。它的工作方式除了在设备上运行时它会导致键盘滞后。 (模拟器很好,当然)我有两种类型的搜索。按你型和回程。我发现两者都需要大约相同的时间来返回结果,但是As-you-type会使键盘滞后。

I have UISearchBar textDidChange that takes the searchText and sends it to a search method that does all the sqlite lifting, puts the results in an Array. The reloads the table.

我有UISearchBar textDidChange,它接受searchText并将其发送到执行所有sqlite提升的搜索方法,将结果放入数组中。重新加载表格。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if((searchType == SEARCH_AS_YOU_TYPE) && ([searchText length] >= 2)){
        NSString *myKeyword = [NSString stringWithFormat:@"%@", searchText];
        [self search:myKeyword];
        [myTableView reloadData];
    }
}

I limit the results to 50. And I my SQL query uses the LIKE and OR, no way around that yet.

我将结果限制为50.而我的SQL查询使用LIKE和OR,还没有办法解决。

SELECT WORD_ID, DEFIN, PINYIN, SIMP, TRAD from WORDS where DEFIN LIKE "%to dog %" OR DEFIN LIKE "%dog" OR DEFIN LIKE "%dog%"  ORDER BY DEFIN LIMIT 50

I've also tried moving the [myTableView reloadData] into the search method, in hopes that the keyboard would at least not lag. No Joy. And sadly I know that sqlite is basically checking every row, when it uses the like operator. But 3-4 seconds for 80rows seems kinda slow.

我也尝试将[myTableView reloadData]移动到搜索方法中,希望键盘至少不会滞后。没有喜悦。遗憾的是,我知道sqlite基本上是检查每一行,当它使用like运算符时。但是对于80人来说3-4秒似乎有点慢。

Any thoughts, ideas, comments or suggestions would be greatly appreciated!

任何想法,想法,意见或建议将不胜感激!

5 个解决方案

#1


It sounds to me that you are searching and ready the keyboard in the same thread. This way you will search as many times as you have characters and the typing speed is limited to the search speed.

听起来你正在搜索并在同一个线程中准备好键盘。这样,您将搜索与字符一样多的次数,并且打字速度仅限于搜索速度。

A proper solution is to separate this into two threads, one to read and display the keyboard, the second to search and display the search results. This way, if you are typing fast er than you can search, only the search will lag, but not the typing. For example the Firefox address bar works that way.

一个合适的解决方案是将其分为两个线程,一个用于读取和显示键盘,第二个用于搜索和显示搜索结果。这样,如果您输入的速度比搜索速度快,那么只有搜索会滞后,而不是输入。例如,Firefox地址栏以这种方式工作。

Your code will be more complex due to the two threads and the communication/coordination between the two, but I think this is the only good solution.

由于两个线程以及两者之间的通信/协调,您的代码将更加复杂,但我认为这是唯一的好解决方案。

#2


Here's how I'm guessing SQLite performs that query:

以下是我猜测SQLite执行该查询的方式:

  1. Find all rows that match one of your LIKE statements.

    查找与您的LIKE语句之一匹配的所有行。

  2. Sort them by DEFIN.

    按DEFIN排序。

  3. Truncate the results after the first 50 rows.

    在前50行之后截断结果。

I suspect the truly painful part is the sort; without that, it could simply collect the first 50 matching rows it found. Can you get away with not sorting the definitions?

我怀疑真正痛苦的部分是那种;没有它,它可以简单地收集它找到的前50个匹配行。你可以逃脱不对定义进行排序吗?

#3


Because you are using LIKE sqlite won't be using an index and it will sequentially scan from the start till is hits a limit of 50 records in the result set. Depending on the order of your data it could hit the first 50 results in the beginning or at the end worst case.

因为您正在使用LIKE sqlite将不会使用索引,它将从开始顺序扫描,直到达到结果集中的50条记录的限制。根据您的数据顺序,它可能会在开始或结束时遇到前50个结果。

How about you create new column that stores the first letter of each of the base words in defin ie d for dog etc and index this column.

如何创建新列,用于存储defin中每个基本单词的第一个字母,即d等等,并为此列编制索引。

Modify your query to select * from words where fisrtletter = :firstletter order by defin limit 50

修改您的查询以从fisrtletter =的词语中选择*:首先按照定义限制50排序

This will cut your search space significantly

这将显着减少您的搜索空间

The use the like operator for the complete match

使用like运算符进行完全匹配

you could also pre-order the data so that the order by won't be needed, I suspect the order by will cause the full table to be scanned rather than terminating when the first 50 records are hit

你也可以预先订购数据,这样就不需要订单了,我怀疑订单会导致扫描整个表而不是在前50个记录被点击时终止

#4


Try making the search query in a different thread. As UI operations are performed only on the main thread, any time consuming operations done on the main thread will delay the UI operations.

尝试在不同的线程中进行搜索查询。由于UI操作仅在主线程上执行,因此在主线程上执行的任何耗时操作都将延迟UI操作。

#5


I generally use

我一般用

[self performSelectorInBackground:@selector(threadedFetch) withObject:nil];

in combination with Core Data's NSFetchedResultsController to start a fetch upon user search input. But be careful when treading. Use separate NSManagedObjectContext for each thread or have a single context which you lock with -[NSManagedObjectContext lock].

与Core Data的NSFetchedResultsController结合使用,可以在用户搜索输入时启动提取。但是在踩踏时要小心。为每个线程使用单独的NSManagedObjectContext,或者使用单个上下文锁定 - [NSManagedObjectContext lock]。


推荐阅读
  • 主调|大侠_重温C++ ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 开发笔记:由数据库某字段存数组引发的json_encode/serialize思考
    开发笔记:由数据库某字段存数组引发的json_encode/serialize思考 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文详细介绍了Java中的注解功能,包括如何定义注解类型、设置注解的应用范围及生命周期,并通过具体示例展示了如何利用反射机制访问注解信息。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 掌握Mosek矩阵运算,轻松应对优化挑战
    本篇文章继续深入探讨Mosek学习笔记系列,特别是矩阵运算部分,这对于优化问题的解决至关重要。通过本文,您将了解到如何高效地使用Mosek进行矩阵初始化、线性代数运算及约束域的设定。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 理解与应用:独热编码(One-Hot Encoding)
    本文详细介绍了独热编码(One-Hot Encoding)与哑变量编码(Dummy Encoding)两种方法,用于将分类变量转换为数值形式,以便于机器学习算法处理。文章不仅解释了这两种编码方式的基本原理,还探讨了它们在实际应用中的差异及选择依据。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
author-avatar
我要知道521无敌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有