2011-05-11 80 views
0

我想使用SQLite 3尽可能优化简单的SQLite查询!

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并没有真正的数据库的所有功能,如果你有更好的东西我可以使用,非常感谢!

回答

0
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; 

Theorically来说,这应该是更快becase的用它的四两对表扫描这一翻译。 无论如何,我会创建一个有几个毫秒记录的表,并用 定时器测试不同的查询。 (在sqlite控制台中打开.timer)。

此外,请确保测试有和没有价值指数。有时候,特别是 当索引大小如果大于你的内存,索引是没用的。

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

+0

它似乎跑得快一点,但我没有足够的行,但真正看到差异。谢谢 ! – Kikohs 2011-05-12 14:05:09

0

这是另一种方法。我不知道在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 
+0

每个单独的查询工作,但都在一起失败: 例外名称[1 ORDER BY术语并不在结果集匹配任何列]:NS_ERROR_FAILURE – Kikohs 2011-05-11 21:40:41

+0

也许我的查询没有括号来界定联合的两个子查询。 – Joel 2011-05-11 21:51:00

+0

我认为错误是更多的2顺序。 SQLite似乎不喜欢它们。 – Kikohs 2011-05-11 21:53:08

0
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