1

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

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

堆栈:

  1. 导轨 4
  2. MySQL 5.5
  3. Geokit-rails 宝石

我想请你帮忙,如何通过地理数据加快搜索速度。我应该实现类似于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列,我尝试在它们上添加索引,但搜索的加载时间保持不变。

4

3 回答 3

1

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

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

  def down
    remove_index :stores, [:latitude, :longitude]
  end
end
于 2014-11-18T11:02:53.980 回答
0

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

于 2014-11-18T10:48:22.403 回答
0

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

于 2014-11-18T11:27:28.373 回答