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

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

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

堆栈:

  1. 导轨 4
  2. MySQL 5.5
  3. 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 列,我尝试在它们上添加索引,但搜索的加载时间保持不变。

【问题讨论】:

标签: mysql ruby-on-rails ruby geolocation geokit


【解决方案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 解决此问题的人的意见
      猜你喜欢
      • 1970-01-01
      • 2014-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2023-01-05
      • 1970-01-01
      相关资源
      最近更新 更多