最近的MySQL空间连接

问题描述 投票:0回答:1

我四处张望,发现有很多人想要按距离设定点的距离来排序点表,但是我很好奇如何有效地以两点之间的最小距离连接两个表。就我而言,请考虑表nodescentroids

CREATE TABLE nodes (
    node_id VARCHAR(255),
    pt POINT
);
CREATE TABLE centroids (
    centroid_id MEDIUMINT UNSIGNED,
    temperature FLOAT,
    pt POINT
);

我有大约300k的节点和15k的质心,我想获得最接近每个节点的质心,以便为每个节点分配一个温度。到目前为止,我已经在两个表的pt上创建了空间索引,并尝试运行以下查询:

SELECT
    nodes.node_id,
    MIN(ST_DISTANCE(nodes.pt, centroids.pt))
FROM nodes
INNER JOIN centroids
ON ST_DISTANCE(nodes.pt, centroids.pt) <= 4810
GROUP BY
    nodes.node_id
LIMIT 10;

很显然,此查询无法解决我的问题;它不检索温度,假定最接近的质心在4810内,并且仅求值10个节点。但是,即使进行了这些简化,此查询的优化效果也很差,并且在我键入此查询时仍在运行。当我让MySQL提供有关查询的详细信息时,它说没有索引被使用,并且没有任何空间索引被列为可能的键。

我如何建立一个查询,该查询实际上可以利用空间索引返回我想要加入的数据?

mysql spatial
1个回答
0
投票

有很多方法可以解决这个每组最少n个问题。

一种方法使用自左联接反模式:

select 
    n.node_id,
    c.centroid_id,
    st_distance(n.pt, c.pt) dist
from nodes n
cross join centroids c
left join centroids c1 
    on c1.centroid_id <> c.centroid_id
    and st_distance(n.pt, c1.pt) < st_distance(n.pt, c.pt)
where c1.centroid_id is null
© www.soinside.com 2019 - 2024. All rights reserved.