2013-10-13 75 views
1

我有如下表:在MySQL中有最近鄰居搜索的方法嗎?

CREATE TABLE numbert_t (v DOUBLE , id INTEGER, INDEX(v)) 

,我想做一個查詢與paremeter q,在距離ABS排序分(Q - V)。例如

SELECT v, id, ABS(q - v) AS d FROM number_t ORDER BY d 

我試過上面的查詢,這一個:

SELECT v, id, (v - q) AS d FROM numbers_t WHERE (v - q) > 0 
ORDER BY d 

我也試過上面的細微變化:

SELECT v, id, (v - q) AS d FROM numbers_t WHERE v > q ORDER BY v 

他們是不等價的,但我不」不介意做兩個查詢,並有兩個獨立的遊標。但是,在所有情況下,EXPLAIN都表示,filesort,不會使用索引。我可以讓MySQL以某種方式使用索引來解決這個問題嗎?

+0

你可以在sqlfriddle上發佈一個例子嗎? –

回答

2

你嘗試:

SELECT MIN(v), id FROM number_t WHERE v >= q 
UNION 
SELECT MAX(v), id FROM number_t WHERE v < q 

MySQL的具體,不規範,因爲ID的。但是,您可以在之後檢索到,這樣您就可以得到確切的值。

+1

謝謝你的回答。在你的查詢中解釋說「使用where」,也就是說,這有效地觸發了索引的使用。此外,我可以使用兩個查詢和LIMIT:SELECT v,id,v - 0.4 AS d FROM numbers_t WHERE v <0.4 ORDER BY v LIMIT 10;我仍然在那裏「使用在哪裏」......沒有「極限」部分,它不起作用。這個和兩個遊標將用於離線執行局部敏感哈希... – dsign

1

您可以使用空間擴展和點數據類型。然後,當點位於邊界框內時,可以使用鄰近搜索。你也可以使用我的quadkey庫。它使用希爾伯特曲線和墨卡託投影。你可以下載我的php類hilbert曲線@ phpclasses.org。