【问题标题】:PHP/MySQL Debug + OptimizationPHP/MySQL 调试 + 优化
【发布时间】:2012-06-29 00:24:37
【问题描述】:

我的数据库中存储了大约 100,000 个商家,表中包含他们的姓名、纬度、经度

现在我的搜索功能接受纬度/经度输入,并找到半径 10 英里内的商店。然而,这 100,000 家商户中有很多是特许经营商(即关联商店组)。对于特许经营权,我只想显示最近的商店,而隐藏同一特许经营权的其余商店(如果半径 10 英里内有多个位置)。

我已经尝试过:

SELECT SQL_CALC_FOUND_ROWS *, xxxxx as Distance
FROM table
WHERE isActive = 1
GROUP BY Name
HAVING Distance < 10
ORDER BY Distance ASC

xxxxx 是根据输入 lat/lon 计算距离的函数:

((ACOS(SIN('$lat'*PI()/180)*SIN(`Latitude`*PI()/180) + COS('$lat'*PI()/180)*COS(`Latitude`*PI()/180)*COS(('$long'-`Longitude`)*PI()/180))*180/PI())*60*1.1515)

但是它没有返回正确的结果。与没有“GROUP BY”子句的相同查询进行比较时,无论是特许经营店还是非特许经营店,我得到的结果都明显减少。不知道有什么问题?

而且,速度真的很慢。我有名称列索引。但我认为“GROUP BY Name”是瓶颈,因为 MySQL 必须进行大量字符串比较?假设可以修复 GROUP BY 错误,我想知道我有什么选择可以加快速度。是否值得设置一个“Business_Group”列并对商店进行预处理,以便为特许经营店分配一个 Business_Group ID,这样 GROUP BY 会更快,因为它比较 int?

【问题讨论】:

  • 我认为距离计算很好(可能不如空间索引设置好,但对我们的目的有好处)。在添加 GROUP BY 子句之前,它非常快,并且在 10 英里内返回了正确的结果。现在我只想限制加盟店只显示一个位置,所以我尝试添加 GROUP BY Name,结果是丢失了不应该丢失的商店,而且速度也慢了很多
  • 在添加GROUP BY之前显示快速查询
  • SELECT SQL_CALC_FOUND_ROWS *, xxxxx as Distance FROM table WHERE isActive = 1 HAVING Distance

标签: php mysql


【解决方案1】:

使用计算列views创建一个虚拟表xxxxx

并使用表和view的连接。

这将更快和优化。

【讨论】:

  • 视图只是 SQL 语句的别名,因此带有视图的查询看起来更简单。
【解决方案2】:

尝试对派生表进行分组

SELECT * FROM (
    SELECT *, xxxxx as Distance FROM table WHERE isActive = 1 
    HAVING Distance < 10 ORDER BY Distance ASC
) AS all
GROUP BY Name

在未分组查询中,HAVING 适用于作为即时过滤器的每条记录,而 GROUP BY 适用于整个组,因此首先用所有数据填充组,然后使用 HAVING 过滤。

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多