我在Android上使用SQLite。
我想根据where子句从1000条记录数据库中返回10条记录。例如select * from log where level > 5
。列level
未编入索引。 SQLite如何检索数据?我假设它将逐个通过所有记录并过滤掉无效记录,对吗?
在这种情况下,使用像LevelDb这样的键值存储会更快吗?
答案 0 :(得分:1)
我假设它将逐个通过所有记录并过滤掉无效记录,对吗?
差不多,是的。
这称为全表扫描,如果您的表格很大,将会导致性能不佳。
如果您对SQLite如何执行查询感到好奇,可以在设备上或命令行sqlite3可执行文件中使用EXPLAIN
关键字(可在platform-tools
文件夹中找到)您的Android SDK)。
如果您运行EXPLAIN <your query>
,它将为您提供一串实际代码,该代码将在执行该查询时在sqlite的虚拟机中运行。除非你自己开发/调试sqlite,否则这很少有用。
如果你运行EXPLAIN QUERY PLAN <your query>
,它会为你提供一个高级别的视图,包括使用的索引(如果有的话)。
答案 1 :(得分:0)
如果未编入索引,它将执行顺序(线性)搜索以查找符合该标准的所有记录。这将要求每次执行所有1000条记录。
如果它被编入索引,那么它显然会使用索引来查找记录,这些记录在所有情况下都会快得多。
如果您要以任何频率执行此操作,则应将其编入索引。如果它是一次性的,那么索引就不会让你失望。尽管性能可能不会明显加快,但它是索引的用途,并且不会将索引编入索引的糟糕设计。