【问题标题】:Slow performance with ST_CONTAINSST_CONTAINS 性能下降
【发布时间】:2017-05-15 11:10:32
【问题描述】:

我有一个带有 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 是多边形类型。

【问题讨论】:

  • 你在使用SPATIAL索引吗?与哪个ENGINE,MyISAM?还是 InnoDB?
  • 如果有人想知道,SPATIAL 索引解决了这个问题。

标签: mysql mariadb


【解决方案1】:

你的很大一部分速度在这里丢失了: Point(`place`.lng, `place`.lat)

这不能被索引,所以原则上它必须遍历每个`place`行才能完成搜索。

更好的解决方案是创建一个新列,如 `place`.pointvalue,它是从 Point(`place`.lng, `place`.lat) 派生的点数据类型,然后索引 `place`.pointvalue

那么你的查询看起来像

SELECT `mo_geometry`.`oktmo` FROM `place`
INNER JOIN `oktmo_geometry` ON ST_CONTAINS(`oktmo_geometry`.`geometry`, `place`.pointvalue)

我怀疑这会快很多。

【讨论】:

  • 如果我们想要一个区域内的点,问题仍然存在。地点可以包含多个未列出的点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2014-02-18
  • 2013-12-24
  • 2013-11-14
相关资源
最近更新 更多