2011-05-11 79 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