【问题标题】:How to improve SQLite query in android?如何改进 android 中的 SQLite 查询?
【发布时间】:2012-07-02 17:12:57
【问题描述】:

我对此有点迷茫。我有一个从具有 439397 条记录 (~32MB) 的静态 SQLite 数据库中读取的应用程序。

我在索引的列上查询数据库,但完成查询需要大约 8-12 秒。我正在使用的当前查询是对 id 列表执行 database.query(tableName, columnHeaders, "some_id=" + id)。

我尝试执行“WHERE some_id IN (id1, id2, id3)”方法,但耗时是原来的两倍。我有一种感觉,我可能做错了。

查询是在 AsyncTask 中完成的,所以我不知道我还能做些什么来提高性能。

  • 更新:

我通过更改应用程序的行为解决了问题。

【问题讨论】:

  • 你考虑过使用“限制”
  • 我需要所有匹配的记录:(
  • 您的列表中有多少个 id。
  • 这些行有什么吗? stackoverflow.com/questions/3626419/…
  • 列表中大约有 200-300 个 id

标签: android sqlite


【解决方案1】:

您可以使用EXPLAIN QUERY PLAN 来确认您的索引确实被正确使用。

您可以尝试使用 COUNT(*) 而不是真正的列列表运行一次查询,以查看问题是否是实际从闪存中读取行数据的行为(如果有很多匹配项,这是可能的)还有很多大柱子)。

您可以尝试运行查询以匹配单个 ID(而不是其中 N 个),以开始尝试处理问题是否是比较次数过多。

但是,请记住,AsyncTask 不会以某种方式让事情变得神奇地更快。它使事情神奇地不在主应用程序线程上运行。

【讨论】:

  • 我可以确认索引正在被使用。此外,如果没有索引,查询将占用一分钟多的时间。那我应该在线程上进行查询吗?
  • @ktklam9:您已经在一个线程上进行查询——AsyncTask 提供的线程。同样,简单地将查询移到后台不会使查询花费更少的时间,但它会通过占用主应用程序线程来阻止您获得 ANR。
  • 如何将查询拆分为多个线程?有些设备是多核的,结果可能用 MergeCursor 包装。
  • @pawelzieba:如果闪存是门控因素,这不太可能有助于提高整体速度。但是,如果 UI 可以呈现部分结果(例如,从前几个 ID 开始),以便在完成其余工作的同时给用户一些可以咀嚼的东西,那么执行一些较小的序列化查询可能会很有用。
  • 问题是我需要所有的记录才能向用户显示一些东西。
【解决方案2】:

看起来您在该字段上没有索引。请注意,如果您在实际查询中使用它们进行过滤/排序/分组,索引可能需要涵盖多个字段(无法详细说明,因为我没有看到它)。

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2017-11-08
    • 2015-03-12
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2015-08-11
    相关资源
    最近更新 更多