使用ST_CONTAINS表现缓慢

时间:2017-05-15 11:10:33

标签: mysql mariadb

我有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_geometrygeometry是多字形类型。

1 个答案:

答案 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)

我怀疑这会更快。