如何解决基于慢速位置的搜索结果查询
您可以使用MysqL空间扩展并将纬度和经度保存为点数据类型,并使其成为空间索引。这样,您可以沿曲线对坐标进行重新排序并减小尺寸并保留空间信息。您可以使用空间索引作为边界框来过滤查询,然后使用harvesine公式选择最佳结果。您的边界框应大于大圆的半径。
这是一个具有点数据类型的简单示例:
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT * FROM mytable
WHERE MBRContains
(
Linestring
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND distance(Point($x, $y), location) <= $radius
我不确定它是否有效,因为它使用的是带有定界框功能的radius变量。在我看来,MBRwithin有点简单,因为它不需要任何参数:Mysql:优化在嵌套集合树中查找超级节点。
解决方法
我有一个查询,用于查找按位置排序的结果。结果还必须考虑增值税,因此这也在查询中。不幸的是,该查询在未缓存时可能需要4秒钟以上的时间才能运行。谁能发现任何明显的问题或建议我做些什么来改善它?
只是为了澄清查询中正在发生的事情:
- 计算的距离是使用经/纬度的欧几里得距离
- 当包含增值税时,incvat字段用于显示价格
- WHEN / THEN语句用于将价格0置于最底端
查询:
SELECT *,ROUND( SQRT( POW( ( 69.1 * ( company_branch_lat - 52.4862 ) ),2 ) + POW( ( 53 * ( company_branch_lng - - 1.8905 ) ),2 ) ),1 ) AS distance,hire_car_day + ( hire_car_day * 0.2 * ! hire_car_incvat ) AS hire_car_day_incvat,hire_car_addday + ( hire_car_addday * 0.2 * ! hire_car_incvat ) AS hire_car_addday_incvat,hire_car_week + ( hire_car_week * 0.2 * ! hire_car_incvat ) AS hire_car_week_incvat,hire_car_weekend + ( hire_car_weekend * 0.2 * ! hire_car_incvat ) AS hire_car_weekend_incvat
FROM hire_car
LEFT JOIN company_branch ON company_branch_id = hire_car_branchid
LEFT JOIN hire_cartypelink ON hire_cartypelink_carhireid = hire_car_id
LEFT JOIN users ON company_branch_userid = user_id
WHERE 1
GROUP BY hire_car_id
HAVING distance <=30
ORDER BY CASE hire_car_day_incvat
WHEN 0
THEN 40000
ELSE hire_car_day_incvat
END,distance ASC
LIMIT 0,30
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。