1

我有下表:

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

我想使用参数 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 都表示文件排序,不会使用索引。我可以让 MySQL 以某种方式使用索引来解决这个问题吗?

4

2 回答 2

2

你试过了吗:

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

MySQL 特定的,而不是标准的,因为 id。但是在您获得确切的值,可能会检索到 id 。

于 2013-10-13T16:47:45.570 回答
1

您可以使用空间扩展和点数据类型。然后,您可以使用邻近搜索,例如当一个点位于边界框内时。你也可以使用我的四键库。它使用希尔伯特曲线和墨卡托投影。你可以在@phpclasses.org 下载我的php 类希尔伯特曲线。

于 2013-10-13T15:40:44.803 回答