如果可能的话,优化一个简单的 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 查询!的主要内容,如果未能解决你的问题,请参考以下文章