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 【问题描述】:我有一个数据库表,其中包含存储latitude
和longitude
坐标的列(两者都具有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
表上没有索引。我在数据库中有一个类似的表,其中也有 latitude
和 longitude
列,我尝试在它们上添加索引,但搜索的加载时间保持不变。
【问题讨论】:
能否请您发布该表的数据库架构?那张表上有索引吗? 感谢您的评论,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】:解决此问题的最佳方法是使用地理空间索引。但是geokit
和geocoder
都不支持它们用于关系数据库。 rgeo
gem 可以。然而,它没有很好的记录。如果你正在做一些 serios 搜索的东西,将这个问题委托给 elastic_search 可能是有意义的。
【讨论】:
感谢您的回答,dre-hh
。我会仔细看看elastic_search
。说到地理空间索引,我发现了这个 - github.com/rgeo/activerecord-mysqlspatial-adapter - gem,想知道它是否值得玩,因为它已经过时了。
我实际上不知道有人用关系数据库解决这个问题。仅听取使用 mongo 或 elastic_search 解决此问题的人的意见以上是关于Geokit-rails + MySQL:如何通过经纬度加快搜索速度?的主要内容,如果未能解决你的问题,请参考以下文章