2

我的数据库中存储了大约 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 是根据输入纬度/经度计算距离的函数:

((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?

4

2 回答 2

0

尝试对派生表进行分组

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.

于 2012-06-27T14:38:45.097 回答
0

使用计算列视图制作虚拟表 xxxxx

并使用表和视图的连接。

这将更快和优化。

于 2012-06-27T14:46:47.423 回答