2010-07-19 51 views
0

我正在處理一個龐大的數據庫並試圖對其進行優化。如果在函數中使用它們的值,我應該在列上創建一個索引嗎? (SQLite)

我想知道是否會進行任何更改,以索引在請求中用作條件的值,但通過函數進行索引。

,比如我有這個GPS座標表:

-Node (#id,lat,lng) 

和這個請求:

SELECT * FROM Node WHERE distance(lat, lng, $lat, $lng) < $threshold 

將建立在緯度和經度的指數作任何優化? (我使用SQLite工作)

感謝

編輯我只是想到了同樣的問題,但如果我的計算,直接,如:

SELECT * FROM Node WHERE (lat-$lat)*(lat-$lat) + (lng-$lng)*(lng-$lng) < $threshold 
+0

我不相信距離()是在這種情況下,聚合函數,除非它從所有行來計算距離使用的數據;它看起來像計算經度/緯度兩點之間的笛卡爾距離,並根據輸入值返回給函數本身的單個值,而不是從表結果集,使其成爲標量函數。 – 2010-07-19 18:31:41

+0

是的,實際上它是一個標量函數。謝謝。 – Julien 2010-07-19 18:38:49

回答

1

數據庫將需要計算示例中每個節點的距離,並且不會從索引獲益。但是,如果您指定lng和lat列,並使用它們首先消除所有具有abs(lat - $ lat)> $ threshold或abs(lng - $ lng)> $ threshold的節點,則可以看到性能提高,因爲數據庫可以在計算剩餘記錄的距離之前,使用創建的索引消除多個記錄。

查詢會是這個樣子:

SELECT * FROM Node 
WHERE lat >= $lat - $threshold 
AND lat <= $lat + $threshold 
AND lng >= $lng - $threshold 
AND lng <= $lng + $threshold 
AND distance(lat, lng, $lat, $lng) < $threshold; 
2

對於查詢,你絕對會看到性能優勢。

但是對於巨型數據庫,您還會遇到插入時的性能問題。

+0

其實我看不出來,因爲索引只是對數值進行排序(在這種情況下lat和lng),對吧? SQLite引擎不知道函數(距離)是單調的,甚至不是線性的。那麼它將如何知道它只需要計算一部分值呢? – Julien 2010-07-19 18:51:51

+1

@ julien - 我可能是錯的,因爲我不是一個SQLite專家,但數據庫引擎仍然必須找到該行的功能,否?在大型數據庫中,索引會產生我懷疑的顯着差異。 – 2010-07-19 19:01:35

相關問題