php中的外卖餐馆查找器帮助

php中的外卖餐馆查找器帮助,php,mysql,Php,Mysql,好的,我正在建立一个外卖查找器,它可以在英国邮政编码的设定距离内找到外卖。用户将自己的邮政编码放入一个输入框中,然后单击“提交”,网站就会在用户附近搜索外卖。但问题是,这种搜索是基于个人外卖的送货距离。因此,如果外卖的送货距离为12英里,并且员工的邮政编码在外卖的12英里以内,那么结果就会显示出来 到目前为止,我有英国邮政编码数据库,带有lang和lat坐标,而且外卖数据库表包含外卖自己的邮政编码及其配送距离,但不包含外卖邮政编码的long和lat值 我所要求的不是代码,而是如何做到这一点的逻辑

好的,我正在建立一个外卖查找器,它可以在英国邮政编码的设定距离内找到外卖。用户将自己的邮政编码放入一个输入框中,然后单击“提交”,网站就会在用户附近搜索外卖。但问题是,这种搜索是基于个人外卖的送货距离。因此,如果外卖的送货距离为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  
选择*,6371*ACos(弧度(纬度))*Cos(弧度(56.0062))*Cos(弧度(-3.78189)-弧度(经度))+Sin(弧度(纬度))*Sin(弧度(56.0062))作为距离
来自邮政编码

考虑到距离性能,考虑消除不需要的字段。问题是您正在根据计算值进行排序,因此需要检查每一行

理想情况下,您可以执行额外的过滤以减少所需的行数。也许匹配邮政编码的前缀会有所帮助。您可能会注意到,如果邮政编码的前X个字符不匹配,那么它一定在12英里以外

如果您有很多字段要检索,那么您还可以从中看到性能的巨大提升。在您的例子中,这尤其有用,因为您可以提供一个小得多的数据集供MySQL排序


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

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


这打开了使用MySQL在一系列点列上添加R树索引的可能性。这本身并不能提供足够精确的距离,但它可以使您将数据集缩小到一个小得多的部分,从而有效地计算出真实距离。

以公里为单位。将
6371
更改为
3963.1676
以获取英里数。(这是地球的半径。)谢谢,这就解决了一个问题。另一种方法是计算一个边界框,并在SELECT语句的WHERE子句中使用这些值,因此昂贵的计算只在dataTrue的子集上执行。虽然使用lat/long时边界框很复杂,因为使用固定的度数值时,框的物理大小会随着与极点的距离的改变而发生巨大变化。我认为在这种情况下,最大距离是不知道的,直到读取外卖记录并检索其最大免费交付,让它难以在有条款的情况下使用你是否只关注英国?这将决定这一方法是否有意义。你可以把它看作是一种更容易实现的东西。对geohash进行前缀匹配可以有效地编制索引。