后台:我在我的flex应用程序中使用SQLite数据库。数据库的大小为4 MB,有5个表
问题:每当我在任何表上运行select查询时,从数据库表中获取数据大约需要(大约50秒)。这使得应用程序在从表中获取数据时非常缓慢且无响应。
如何提高SQLite数据库的性能,以便减少从表中获取数据所需的时间?
由于
答案 0 :(得分:4)
正如我在评论中告诉你的那样,在不知道数据库包含什么结构的情况下,以及针对数据运行的查询,我们无法推断为什么您的查询需要花费很多时间。
然而,这是一篇关于索引的有趣读物:Use the index, Luke!。它告诉您索引是什么,如何设计索引以及可以获得哪些好处。
此外,如果你可以发布查询和表模式和基数(不是内容),也许它可以帮助。
答案 1 :(得分:3)
您使用的是异步还是同步执行模式?它们之间的区别在于,当应用程序继续运行时,异步执行在后台运行。然后,您的应用程序必须监听已发送的事件,然后执行任何后续操作。但是,在同步模式下,在数据库操作完成之前,用户将无法与应用程序交互,因为这些操作在与应用程序相同的执行顺序中运行。同步模式在概念上实现起来更简单,但异步模式将产生更好的可用性。
SQLStatement.execute()
实例上的第一次SQLStatement
,语句在执行前自动准备。只要SQLStatement.text
属性未更改,后续调用将执行得更快。使用相同的SQLStatement
实例比一次又一次地创建新实例更好。如果您需要更改查询,请考虑using parameterized statements。
您还可以使用诸如在运行时延迟所需数据的技术。如果您只需要数据子集,请先将其拉回,然后根据需要检索其他数据。这可能取决于您的应用范围以及您需要满足的需求。
如果您有多个数据库,则使用表名指定数据库将阻止运行时检查每个数据库以查找匹配的表。它还有助于防止运行时选择错误的数据库(如果未指定)。即使您只有一个数据库,也要SELECT email FROM main.users;
而不是SELECT email FROM users;
。 (main
时,会自动将SQLConnection.open
指定为数据库名称。)
如果您正在对数据库进行大量更改(多个INSERT
或UPDATE
语句),请考虑将其包装在事务中。运行时将在内存中进行更改,然后写入磁盘。如果不使用事务,则每个语句将导致对数据库文件的多次磁盘写入,这可能会很慢并且会占用大量时间。
尽量避免任何架构更改。表定义数据保存在数据库文件的开头。运行时在打开数据库连接时加载这些定义。添加到表中的数据保留在数据库文件中的表定义数据之后。如果添加列或表等更改,新表定义将与数据库文件中的表数据混合使用。这样做的结果是运行时必须从文件的不同部分而不是从头开始读取表定义数据。 SQLConnection.compact()
方法重新构造表定义数据,使其位于文件的开头,但其缺点是,如果数据库文件很大,此方法也会消耗很多时间,而且更多。
最后,正如Benoit在他的评论中指出的那样,考虑改进您自己的SQL查询和您正在使用的表结构。知道您的数据库结构和查询是否是性能缓慢的实际原因将是有帮助的。我的猜测是你正在使用同步执行。如果你切换到异步模式,你会看到更好的性能,但这并不意味着它必须停在那里。
在线Adobe Flex文档提供了有关improving database performance和best practices working with local SQL databases的更多信息。
答案 2 :(得分:0)
您可以尝试索引SELECT语句的WHERE子句中使用的某些列。您也可以尝试最小化LIKE关键字的使用。
如果您要一起加入表格,可以尝试简化表格关系。
就像其他人所说的那样,如果不了解更多关于你的架构和你正在使用的SQL,很难具体化。