Geokit-rails + MySQL:如何通过经纬度加快搜索速度?

Posted

技术标签:

【中文标题】Geokit-rails + MySQL:如何通过经纬度加快搜索速度?【英文标题】:Geokit-rails + MySQL: How to speed up search through latitude and longitude? 【发布时间】:2014-11-18 10:19:17 【问题描述】:

我有一个数据库表,其中包含存储latitudelongitude 坐标的列(两者都具有decimal 数据类型)。通过搜索,该表大约有 500k 行。

问题是,如果我搜索半径为 100-200 英里的行,搜索会持续大约 140 秒,这无法投入生产。

堆栈:

    导轨 4 mysql 5.5 Geokit-rails gem

我想就如何通过地理数据加快搜索速度向您寻求帮助。我应该实现类似于kayak.com 的搜索,在哪里向用户显示一些结果并且搜索仍在后台运行?

提前谢谢你。

编辑:“商店”方案

  create_table "stores", force: true do |t|
    t.string   "store_name"
    t.string   "address"
    t.string   "city"
    t.string   "state"
    t.string   "county"
    t.string   "zip_code"
    t.decimal  "latitude",                    precision: 10, scale: 6
    t.decimal  "longitude",                   precision: 10, scale: 6
  end

表上没有索引。我在数据库中有一个类似的表,其中也有 latitudelongitude 列,我尝试在它们上添加索引,但搜索的加载时间保持不变。

【问题讨论】:

能否请您发布该表的数据库架构?那张表上有索引吗? 感谢您的评论,spickermann。我将表格方案添加到 OP。 查看github.com/alexreisner/geocoder#advanced-querying 【参考方案1】:

我会先在经度和纬度列上放置一个组合索引,如下所示:

class AddIndexToStoresLongitudeLatitude < ActiveRecord::Migration
  def up
    add_index :stores, [:latitude, :longitude]
  end

  def down
    remove_index :stores, [:latitude, :longitude]
  end
end

【讨论】:

【参考方案2】:

如果@spickermann 的回答不起作用,IMO 你应该迁移到 Postgres。 PostGis 是一个非常强大的工具,具有出色的性能。 http://postgis.net/

【讨论】:

【参考方案3】:

解决此问题的最佳方法是使用地理空间索引。但是geokitgeocoder 都不支持它们用于关系数据库。 rgeo gem 可以。然而,它没有很好的记录。如果你正在做一些 serios 搜索的东西,将这个问题委托给 elastic_search 可能是有意义的。

【讨论】:

感谢您的回答,dre-hh。我会仔细看看elastic_search。说到地理空间索引,我发现了这个 - github.com/rgeo/activerecord-mysqlspatial-adapter - gem,想知道它是否值得玩,因为它已经过时了。 我实际上不知道有人用关系数据库解决这个问题。仅听取使用 mongo 或 elastic_search 解决此问题的人的意见

以上是关于Geokit-rails + MySQL:如何通过经纬度加快搜索速度?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 通过 SSH 隧道连接 - 如何指定其他 MySQL 服务器?

php通过公网ip链接mysql,速度很慢,如何解决?

如何通过 SSH 连接到 MySQL Docker 容器?

如何通过Node从MySQL查询数据

如何通过ajax将mysql结果作为json传递

如何使用 IP 地址(通过 InetAddress)通过 JDBC 与 MySQL 建立连接?