MySQL GROUP BY在使用空间搜索的三个表之间运行缓慢

时间:2019-05-03 19:19:48

标签: mysql

我正在我的astreetnearyou.org网站上添加一些第一次世界大战的记录

我有三个表:

  • people-包含超过100万人死亡的详细信息
  • 地址-包含约700,000个不同的地址,可容纳约600,000位此类人
  • 墓地-一个新表格,其中记录了大约15,000个墓地;

在关系方面,每个地址都有其所关联的人的ID;人员表中的每个人都有他们埋葬的墓地的名称(顺便说一句,这些可以是长varchar值,为它们提供唯一的整数ID进行连接会更好吗?答案:我尝试过并剃光了)关闭查询时间约0.5秒)

我想运行一个查询,该查询的内容基本上是“给我一个唯一的列表,列出该地图区域(边界框)中所有生活或被埋葬的人”

查询示例:

SELECT people.id, people.rank, people.forename, `people`.surname, people.regiment, people.date_of_death, people.cemeteryname, cemeteries.country, cemeteries.link 
FROM people
JOIN cemeteries ON people.cemeteryId=cemeteries.id 
LEFT JOIN addresses ON addresses.personId=people.id 
WHERE MBRContains( GeomFromText( 'LINESTRING(-0.35 51.50,-0.32 51.51)' ), cemeteries.point) OR MBRContains( GeomFromText( 'LINESTRING(-0.35 51.50,-0.32 51.51)' ), addresses.point)
GROUP BY people.id

这将返回276个结果,但大约需要6秒钟。如果没有GROUP BY,则它有296个结果,包括重复的ID,但用时不到一秒钟。如果删除LEFT JOIN表和关联的WHERE子句(因此我只能通过墓地获得匹配项,而不是地址),这也非常快。

我在点域和处于JOIN条件下的所有域上都有空间索引,此外,根据此处的另一篇文章,我在地址表中的id和点域以及墓地和点中添加了索引墓地表中的字段。

我不是sql专家,因此,如果您有任何建议使它更高效,从而更快,将不胜感激。另外,我猜想更多的表格信息可能会有用,但是您能告诉我什么会有所帮助以及如何产生吗?!

1 个答案:

答案 0 :(得分:0)

ALTER TABLE people ADD INDEX IdCemIdIdx (id, cemeteryId);

如果可能,请使用: https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html