外卖餐厅查找器帮助PHP

时间:2012-01-16 23:54:20

标签: php mysql

好的我正在建造一个外卖取景器,可以在英国邮政编码的设定距离内找到外卖。将要发生的是用户将他/她的邮政编码放入输入框并单击提交,然后该网站搜索用户附近的外卖。但问题是这个搜索是基于个人外卖的交付距离。因此,如果外卖的交货距离为12英里且人员邮政编码距离外卖12英里,则会显示在结果中。

到目前为止,我已经拥有了lang和lat坐标的英国邮政编码数据库,外卖数据库表还保留了外卖自己的邮政编码及其传递距离,但不包含外卖邮政编码的长和纬度值。

我要求的不是代码,而是帮助解决如何执行此操作的逻辑。

我有以下查询可以找到给定long和lat的设定半径内的所有邮政编码,但我不确定它是否以英里为单位,如果它是最快的可能是:

 SELECT * , 6371 * ACos( Cos( RADIANS( latitude ) ) * Cos( RADIANS( 56.0062 ) ) *  Cos(        RADIANS( - 3.78189 ) - RADIANS( longitude ) ) + Sin( RADIANS( latitude ) ) *    Sin( RADIANS( 56.0062 ) ) ) AS Distance
 FROM postcodes
 HAVING Distance <= '10'
 ORDER BY Distance
 LIMIT 3720 , 30  

2 个答案:

答案 0 :(得分:0)

为了提高性能,请考虑删除不需要的字段。问题是你要对计算值进行排序,因此需要检查每一行。

理想情况下,您可以执行其他过滤以减少所需的行数。也许邮政编码的匹配前缀可能会有所帮助。您可以观察到,如果邮政编码的前X个字符不匹配,则必须超过12英里。

如果要检索很多字段,您还可以看到late row lookup带来的巨大性能提升。在您的情况下,这特别有用,因为您可以为MySQL提供更小的数据集进行排序。

这个想法只会拉出每条记录的ID和距离,对它们进行排序,然后拉出前N条记录(无论你需要多少)。然后,您可以使用您提取的ID连接回原始表并检索其余数据。这有帮助,因为它允许MySQL在执行排序时使用更少的内存,如果您的数据集不在内存中,您可以根据行的大小来避免某些磁盘搜索。

答案 1 :(得分:0)

另一个完全独立的选项。如果您只关注英国,可以考虑将某种类型的投影用于笛卡尔坐标系。我相信OSGB可能适合英国,并且应该给出最小的错误。

这开启了使用MySQL的spatial extensions在一系列点列上添加R树索引的可能性。这不会给你足够准确的距离,但它可以使你将数据集缩小到一个可以有效计算真实距离的显着较小的部分。