MySql搜索效率

时间:2014-02-21 03:29:59

标签: mysql count inner-join large-data-volumes

所以我试图从我们拥有的大约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

目前,此脚本运行时间超过两分钟

是否有更有效的方法来获得相同的结果?

1 个答案:

答案 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中它有时会有更好的性能。