MySql 的搜索效率

标签: MySQL
发布时间: 2015/6/12 0:19:36
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

所以我想目前的一些地理数据得到我们有一些 3 万 4000 纪录。

我们存储记录的人,其中包括基础,如名字、 姓氏、 地址和邮编。

我想要获取有关邮编信息并将其链接与他们 Longitue 和纬度的坐标。 为此,我也有一个澳大利亚的邮政编码,与他们长/纬度坐标的表。

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:

这是您的查询:

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

官方微信
官方QQ群
31647020