对不起,如果这已经回答了(我确定有人会扔我的链接,如果有的话)。我回想起一个类似的问题,但我现在找不到它。基于距离的优化用户数据库搜索
所以,对于这个问题:我正在构建用户搜索我正在开发的网站,其中一个搜索条件将基于与搜索用户的距离。我已经有一张美国邮政编码表及其对应的经纬度表。我还想出了如何确定边界框(最大经纬度/最小纬度 - 最大长度/最小长度),以确定哪些拉链符合标准(我们不会担心精确的半径。暂时就足够了)。我的问题 - 我应该如何构建查询来优化速度?我应该:
- 执行必需的数学来确定边界框,然后查询拉链表以找到那些潜在的候选人,然后用任何的那些邮政编码搜索用户的所有邮政编码?
OR
- 确定纬度/经度边框,与用户表连接的zip表并与用户谁的纬度/多头参数之间掉下返回结果?
我想第二种方法会更快,但我没有支持证据/具体经验,这表明它会。我知道有足够的SQL来解决问题,但我仍然对它有所了解,并且在涉及到不同类型操作的相对性能时并不知情。
谢谢你的时间!
谢谢。这个问题可能表达得很差,实际上是询问是否执行两个单独的查询(一个是获取一个邮政编码数组,然后是另一个邮政编码,以查看哪个用户与该列表中的邮编匹配),或者执行联合(非常精确如上所示)。也许愚蠢的问题,我只是不知道连接速度是如何比较两个单独的查询(没有连接)。这是我将继续前进的路线。感谢您花时间。 (以及其他所有人) – dgeare
@dgeare如果您要使用与我建议的查询相似的查询,那么您应该在'location(id,纬度,经度)'上放置一个索引。这样,MySQL就能够仅处理索引,并且通常可以从内存中进行处理。它往往(如果不是总是)比将拉链代码列表(到应用程序层?)更快,然后用这些结果运行第二个查询。至少你避免了两层之间的通信(假设有多层设置,例如PHP + MySQL)。 – RandomSeed
邮政编码表目前使用邮政编码(varchar(5))作为PK,与users表中的外键字段对应。你是否建议在zip表中使用数字代理键会加速连接,或者当前的设置是否足够?谢谢。 – dgeare