背景:在我的flex应用程序中使用SQLite数据库。数据库的大小为4MB,有5个表
问题:每当我对任何表运行select查询时,从数据库表中获取数据需要花费大约50秒的时间(约50秒)。这使得应用程序在从表中获取数据时非常缓慢和没有响应性。
如何提高SQLite数据库的性能,从而减少从表中获取数据所需的时间?
谢谢
发布于 2011-04-26 13:27:39
正如我在评论中告诉您的那样,不知道您的数据库由什么结构组成,以及您对数据运行了哪些查询,我们就无法推断出为什么您的查询需要很长时间。
然而,这里有一个关于索引的有趣阅读:用索引卢克!。它告诉你什么是索引,你应该如何设计你的索引,你能收获什么好处。
另外,如果您可以发布查询、表模式和基数(而不是内容),也许会有所帮助。
发布于 2011-04-26 13:35:07
您正在使用异步或同步执行模式吗?它们之间的区别是,异步执行在后台运行,而应用程序则继续运行。然后,应用程序必须侦听分派的事件,然后执行任何后续操作。但是,在同步模式下,在数据库操作完成之前,用户将无法与应用程序交互,因为这些操作运行在与应用程序相同的执行序列中。同步模式在概念上更容易实现,但异步模式将产生更好的可用性。
第一次在SQLStatement.execute()实例上执行SQLStatement时,语句是在执行之前自动准备的。只要SQLStatement.text属性没有改变,后续调用就会执行得更快。使用相同的SQLStatement实例比一次又一次创建新实例要好。如果需要更改查询,请考虑使用参数化语句。
您还可以使用技术,例如延迟运行时需要的数据。如果您只需要一个子集的数据,请先将其拉回,然后根据需要检索其他数据。这可能取决于您的应用程序范围和您必须满足的需求。
如果有多个数据库,则使用表名指定数据库将阻止运行时检查每个数据库以找到匹配的表。它还有助于防止运行时在未指定的情况下选择错误的数据库。执行SELECT email FROM main.users;而不是SELECT email FROM users;,即使您只有一个数据库。(在调用main时,会自动将SQLConnection.open指定为数据库名称。)
如果您正在对数据库进行大量更改(多个INSERT或UPDATE语句),那么请考虑将其包装在事务中。运行时将在内存中进行更改,然后将其写入磁盘。如果不使用事务,则每个语句都会导致多个磁盘写入数据库文件,这种写入速度可能很慢,消耗大量时间。
尽量避免任何架构更改。表定义数据保存在数据库文件的开头。当打开数据库连接时,运行库将加载这些定义。添加到表中的数据保存在数据库文件中的表定义数据之后。如果更改如添加列或表,则新的表定义将与数据库文件中的表数据混合。这样做的效果是,运行时必须从文件的不同部分读取表定义数据,而不是在开始时读取。SQLConnection.compact()方法重新构造表定义数据,使其位于文件的开头,但其缺点是,如果数据库文件很大,此方法也会消耗更多时间。
最后,正如贝诺特在他的评论中所指出的,请考虑改进您正在使用的自己的SQL查询和表结构。了解数据库结构和查询是导致性能低下的实际原因将是有帮助的。我猜你是在使用同步执行。如果您切换到异步模式,您将看到更好的性能,但这并不意味着它必须停止。
Adobe文档在线有更多关于提高数据库性能和使用本地SQL数据库的最佳实践的信息。
发布于 2011-04-28 01:57:04
您可以尝试索引SELECT语句WHERE子句中使用的一些列。您还可以尝试将LIKE关键字的使用最小化。
如果要将表连接在一起,则可以尝试简化表关系。
就像其他人说的那样,如果不了解您的模式和正在使用的SQL,就很难获得具体的信息。
https://stackoverflow.com/questions/5789800
复制相似问题