我有JOIN的简单sql查询,如果多边形中的点连接:
SELECT `oktmo_geometry`.`oktmo` FROM `place`
INNER JOIN `oktmo_geometry` ON ST_CONTAINS(`oktmo_geometry`.`geometry`, Point(`place`.lng, `place`.lat))
但是那个查询非常慢。我有12k位和300几何。只需50秒就需要3-5秒(取决于MySQL的版本)。我曾尝试使用MariaDB,这比MySQL快〜50倍,但我认为仍然很慢。
我的查询或其他任何内容可能有问题?
oktmo_geometry
。geometry
是多字形类型。
答案 0 :(得分:1)
你的速度的很大一部分在这里丢失了:
Point(`place`.lng, `place`.lat)
这不能编入索引,所以原则上它必须经过每个`place`
行才能完成搜索。
更好的解决方案是创建一个像`place`.pointvalue
这样的新列,它是从点(`place`.lng
,`place`.lat
)派生的点数据类型,然后是索引`place`.pointvalue
然后您的查询看起来像
SELECT `mo_geometry`.`oktmo` FROM `place`
INNER JOIN `oktmo_geometry` ON ST_CONTAINS(`oktmo_geometry`.`geometry`, `place`.pointvalue)
我怀疑这会更快。