【问题标题】:Database Design/Performance – Location search based on city/town covered by company数据库设计/性能 - 基于公司覆盖的城市/城镇的位置搜索
【发布时间】:2013-03-31 14:50:43
【问题描述】:

** 此处使用 PHP/MySQL **

场景:

一家快递公司在全国有多个仓库/仓库,每个仓库只覆盖选定的城市/城镇。当用户访问他们的网站时,他们可以搜索最近/本地的仓库。

我研究了两个选项,每个选项解释如下:

选项一(不起作用):

我用纬度和经度存储每个站点并进行简单的半径搜索,因此当用户进入他们的城市/城镇时,我使用谷歌地图进行地理编码并运行半径查询以获取 25 英里内的所有站点,这确实工作。

但它有一个很大的缺点,一些仓库不覆盖选定的城镇/城市,并且半径搜索没有考虑到这一点,导致即使它们不覆盖该区域,它也会在结果中显示仓库/仓库。

选项二:

将城镇/城市列表存储在一个数据库表中,并将站点存储在另一个表中。然后有一个关系表,将站点链接到它们所覆盖的城镇/城市。用户必须输入确切的城市(此处使用 mySQL LIKE)名称才能返回结果,这将搜索城市表,然后对 depots 表执行 LEFT JOIN

这里的缺点是关系表会快速增长,最多可以有 500 万条记录,这可能会在后期出现性能问题。

方案二的数据库设计:

仓库表

-   ID
-   D_NAME
-   D_ADDRESS
-   D_POSTCODE
-   D_TEL
-   AND SO ON…

城市表

-   ID
-   NAME

关系表

-   ID
-   CITY_ID
-   DEPOT_ID

问题:

我还有其他选择吗?

选项二是正确的方法吗?就性能而言是否可以?

谢谢。

【问题讨论】:

    标签: mysql performance database-design location


    【解决方案1】:

    我认为您描述的关系表没有问题。只要 city 表对搜索词(我假设是城市名称)和外键 ID 有一个复合索引,就可以完美地工作。

    您不希望提供完整的通配符搜索(LIKE %ancouv% 来查找温哥华),但应将搜索限制为前缀搜索 (LIKE vancou%)。否则索引将没有帮助,数据库服务器将不得不进行全表扫描。

    测试时,使用EXPLAIN SELECT ... 命令确保使用您的索引。此外,您应该始终使用实际数量的测试数据进行测试。如果您只有一小部分测试数据,则查询优化器可能会选择与上述数百万行不同的路径。例如,对于一个非常小的表,它可能会决定执行完整扫描而不是索引查找可能是更好的方法,从而导致您相信索引永远不会被使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多