2013-10-13 78 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。