首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql搜索效率

问MySql搜索效率
EN

Stack Overflow用户
提问于 2014-02-21 03:29:59
回答 1查看 45关注 0票数 0

因此,我现在正试图从我们拥有的34000份记录中获得一些地理数据。

我们存储了一个人的记录,其中包括基本的,如名字,姓氏,地址和邮政编码。

我想了解有关邮编的信息,并将其与经度和纬度坐标联系起来。为此,我还有一张带有澳大利亚邮编的桌子,还有他们的长/拉特和弦。

代码语言:javascript
复制
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分钟才能运行,

有没有更有效的方法来获得同样的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-21 04:01:58

这是您的查询:

代码语言:javascript
复制
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)的索引应该会有所帮助。这是第一件要尝试的事。下面重写了消除外部聚合的查询,代之以子查询:

代码语言:javascript
复制
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中,它有时具有更好的性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21924739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档