我正在我的astreetnearyou.org网站上添加一些第一次世界大战的记录
我有三个表:
在关系方面,每个地址都有其所关联的人的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专家,因此,如果您有任何建议使它更高效,从而更快,将不胜感激。另外,我猜想更多的表格信息可能会有用,但是您能告诉我什么会有所帮助以及如何产生吗?!
答案 0 :(得分:0)
ALTER TABLE people ADD INDEX IdCemIdIdx (id, cemeteryId);
如果可能,请使用: https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html