如果可能的话,优化一个简单的 SQLite 查询!

Posted

技术标签:

【中文标题】如果可能的话,优化一个简单的 SQLite 查询!【英文标题】:Optimizing a simple SQLite query, if possible ! 【发布时间】:2011-05-11 20:53:16 【问题描述】:

我想使用 SQLite 3 优化这个查询。

SELECT id FROM Table WHERE value = (SELECT max(value) FROM Table WHERE value < myvalue )
   UNION 
SELECT id FROM Table WHERE value = (SELECT min(value) FROM Table WHERE value > myvalue );

我想要给定值中最接近的 2 个 id。示例:id 20,值 50。最接近的 id 可能是 3,其值为 48(最大值低于),高于 id 4,值为 55(最小值高于)。

SQLite 3 没有真正数据库的所有功能,如果你有更好的我可以使用,谢谢!

【问题讨论】:

【参考方案1】:
SELECT
 (SELECT id FROM test WHERE value < myvalue ORDER BY value DESC LIMIT 1) as below,
 (SELECT id FROM test WHERE value > myvalue ORDER BY value ASC  LIMIT 1) as above;

从理论上讲,这应该更快,因为它使用两个表扫描而不是四个。 无论如何,我会创建一个包含几百万条记录的表并测试不同的查询 计时器开启。 (sqlite 控制台中的.timer ON)。

还要确保在使用和不使用索引值的情况下进行测试。有时,特别 当索引大小超过你的内存时,索引就没用了。

如果速度是真正的问题,请考虑替代光存储,例如京都 内阁。

【讨论】:

它似乎跑得更快了,但我还没有足够的行来真正看到差异。谢谢!【参考方案2】:

这是另一种方法。我不知道它是否在 sqlite 中更快。您可以随时尝试。

select id
from table
where value - myvalue > 0
order by abs(value - myvalue) asc
limit 1
union all
select id
from table
where value - myvalue < 0
order by abs(value - myvalue) desc
limit 1

【讨论】:

每个单独的查询都有效,但一起失败:[第一个 ORDER BY 术语与结果集中的任何列都不匹配] 异常名称:NS_ERROR_FAILURE 也许我的查询缺少括号来分隔两个合并的子查询。 我认为错误更多的是 2 order by。 SQLite 似乎不喜欢它们。【参考方案3】:
SELECT id FROM Table WHERE value > myvalue ORDER BY value LIMIT 1
SELECT id FROM Table WHERE value < myvalue ORDER BY value DESC LIMIT 1

此解决方案没有子选择、表扫描,也没有无关的组或数学函数。 但需要两个查询

你应该索引 Table.value

【讨论】:

以上是关于如果可能的话,优化一个简单的 SQLite 查询!的主要内容,如果未能解决你的问题,请参考以下文章

SQLite3 数据库查询优化

Sqlite 安卓优化

Android数据库代码优化 - 从SQLite说起

搜索 sqlite 数据库的最佳方法

SQLite:如何优化 UNION 查询

SQL查询优化