【问题标题】:Fast Zipcode search in MySqlMySql 中的快速邮政编码搜索
【发布时间】:2014-10-14 18:39:06
【问题描述】:

我有一个 MySQL 的 Florists 表,我正在尝试编写一个搜索函数,该函数将 Zipcode 作为输入,并查找所有发送到该邮政编码的 Florists。 我表中的每个花店记录都有 3 个项目

  • 地理编码的经度(以花店地址为中心)
  • 地理编码纬度(以花店地址为中心)
  • 花店提供的城镇名称和邮政编码的字符串字段 例如- 波士顿(02215、02108、02109)、切尔西(02150)、萨默维尔(02143、02144、02145)

假设我想找到所有送货到“02108”的花店。在 MySQL 中实现此搜索的最佳方法是什么?

我在想

  1. 完全匹配搜索 - 但这需要每次搜索都扫描 整张桌子。效率低下?

  2. Haversine 搜索 + 精确匹配 - 使用纬度/经度值将搜索范围缩小到 15 英里半径

    MySQL Great Circle Distance (Haversine formula) 然后在这些结果中执行精确匹配。

  3. 还有别的吗?

非常感谢您的想法和意见。

【问题讨论】:

  • 您能否在花店 id 和邮政编码上将子表添加为一对多?这将使您的搜索更有效率。
  • 在某些时候,您将进行全表阅读以缩小结果范围。最经济的似乎是邮政编码/城镇字段上的LIKESELECT * FROM table WHERE <field3> like '%<yourzip>%' 例如。在进行LIKE 之前,对所有这些进行Haversine 以缩小范围是很多处理。
  • 感谢 gmiley 和 JNevill 的快速回复。我同意,儿童或连接表是去这里的方式。

标签: mysql search zipcode


【解决方案1】:

正确的方法是将邮政编码列表表示为一个连接表,每个花店一行,每个邮政编码一行。所以,你的第一个花店可能有这些行:

FloristId   Zip
1           02215
1           02108
1           02109
1           02150
1           02143
1           02144
1           02145

然后,在zip 列上建立索引。然后,您可以使用简单的连接来获取送货到特定邮政编码的花店。

您可以使用参考表来查找主要城镇的邮政编码。美国人口普查局有一个从邮政编码制表区域到城镇名称的映射。 USPS 可能有类似的东西。

【讨论】:

  • 谢谢戈登。我认为你的建议是有道理的。感谢您的快速回复!
  • 无论你如何实现它 - 尽量避免期待 5 位数的 zip。前导零的用户通常不提供它们,因此请确保您可以处理“803”和“2145”用例。
  • @AlMills 。 . .在美国,人们总是提供前导零(至少根据我的经验)。也许这是国家精神的一部分,但邮政编码有五位数长(除非它们是九位数)。
猜你喜欢
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
相关资源
最近更新 更多