【发布时间】: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