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

时间:2014-11-18 10:19:17

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

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

问题在于,如果我搜索半径为100-200英里的行,则搜索持续约140秒,这是不可能投入生产的。

筹码:

  1. Rails 4
  2. MySQL 5.5
  3. Geokit-rails gem
  4. 我想请教您如何加快搜索地理数据的速度。我应该实施类似于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列,我尝试在它们上添加索引,但搜索的加载时间保持不变。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

解决此问题的最佳方法是使用地理空间索引。但是,geokitgeocoder都不支持关系数据库。 rgeo宝石确实如此。然而,它没有很好的记录。如果您正在进行一些严格的搜索,那么将此问题委托给elastic_search可能是有意义的。

答案 2 :(得分:0)

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