Android SQLite快速搜索之间的日期

时间:2013-04-18 12:11:57

标签: android database performance sqlite date

对于带有日期范围的SQLite查询,我遇到了巨大的性能问题。

在我的应用程序中,我有一个包含数千个站点记录的数据库。这些网站是可访问的,但不是全年。这些站点中的每一个都可以定义最多三个可访问的范围。因此,我创建了一个包含以下列的SQLite表: open1 close1 open2 close2 open3 close3 (等等)

应用程序用户可以输入他们想要访问网站的时间范围,例如2014.01.01 - 2014.01.07

现在,当我在不限制时间的情况下执行搜索时,它非常快。 但是当我使用开放时间作为搜索条件时,在快速模拟器上搜索最多需要7秒钟。我甚至不想在真实的设备上测试这个:)

打开关闭中的条目属于 DATETIME ,类似于: 2014-01-01

我目前的查询如下:

    SELECT open1,close1,open2,close2,open3,close3 FROM sites WHERE (
      ( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1 ) )
      OR
      ( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open2 AND close2 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open2 AND close2 ) )
      OR
      ( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open3 AND close3 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open3 AND close3 ) )
    )

有没有一种简单的方法来改善效果?

注意:我尝试使用 long 格式的utc值来打开关闭,但这实际上不是可调试的。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我不确定它是否更有效但是简化查询不会有害:

( ( strftime('%Y-%m-%d', '2014-01-01') BETWEEN open1 AND close1 ) AND ( strftime('%Y-%m-%d', '2014-01-07') BETWEEN open1 AND close1 ) )

相当于:

( strftime('%Y-%m-%d', '2014-01-01') >= open1 AND strftime('%Y-%m-%d', '2014-01-07') <= close1 )

只要第一个日期(在这种情况下为“2014-01-01”)在第二个日期('2014-01-07')之前,即您有:

open*&lt; = first&lt; = second&lt; = close*

答案 1 :(得分:1)

首先,您会发现真实设备的性能远远优于仿真器。

现在,问题的真正含义。您应该尝试为WHERE子句(open1子句(close1CREATE INDEX visitableIndex ON sites (open1, close1, ...) 等)中使用的列创建索引。你可以找到很多关于如何做到这一点的教程。简而言之,索引可以帮助数据库引擎快速找到匹配的记录。

尝试类似:

{{1}}