因此,我现在正试图从我们拥有的34000份记录中获得一些地理数据。
我们存储了一个人的记录,其中包括基本的,如名字,姓氏,地址和邮政编码。
我想了解有关邮编的信息,并将其与经度和纬度坐标联系起来。为此,我还有一张带有澳大利亚邮编的桌子,还有他们的长/拉特和弦。
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目前,这个脚本需要1到2分钟才能运行,
有没有更有效的方法来获得同样的结果?
发布于 2014-02-21 04:01:58
这是您的查询:
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中,它有时具有更好的性能。
https://stackoverflow.com/questions/21924739
复制相似问题