所以我试图从我们拥有的大约34,000条记录中获取一些地理数据。
我们存储了Person的记录,其中包括firstname,surname,address和postcode等基础知识。
我想获得有关邮政编码的信息,并将其与他们的Longitue和Latitude坐标联系起来。 为此,我还有一张包含澳大利亚邮政编码及其Long / Lat coords的表格。
SELECT count(p.postcode) AS `count`, p.postcode, pctlt.Lat, pctlt.`Long`
FROM person AS p
INNER JOIN pcodetolonglat AS pctlt ON pctlt.Pcode = p.postcode
WHERE length(p.postcode)=4
GROUP BY p.postcode
目前,此脚本运行时间超过两分钟
是否有更有效的方法来获得相同的结果?
答案 0 :(得分:0)
这是您的查询:
SELECT count(p.postcode) AS `count`, p.postcode, pctlt.Lat, pctlt.`Long`
FROM person p INNER JOIN
pcodetolonglat pctlt
ON pctlt.Pcode = p.postcode
WHERE length(p.postcode) = 4
GROUP BY p.postcode;
对此查询的索引不能做太多。 person(postcode)
上的索引应该会有所帮助。这是第一个尝试的事情。以下是重写您的查询,消除外部聚合,将其替换为子查询:
SELECT pctlt.Pcode, pctlt.Lat, pctlt.`Long`,
(select count(*) from person p where pctlt.Pcode = p.postcode) as `count`
FROM pcodetolonglat pctlt
WHERE length(pctlt.Pcode) = 4 and
exists (select 1 from person p where pctlt.Pcode = p.postcode);
exists
子句是模仿inner join
。
使用person(postcode)
上的索引,此查询可能比原始查询运行得更快。我不喜欢用相关的子查询替换group by
,但在MySQL中它有时会有更好的性能。