我的数据库中存储了大约 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?