Geokit-rails + MySQL: как ускорить поиск по широте и долготе?
У меня есть таблица базы данных, которая содержит столбцы хранения latitude
а также longitude
координаты (оба имеют decimal
тип данных). В таблице около 500 тыс. Строк, через которые производятся поиски.
Проблема состоит в том, что если я ищу строки, которые находятся в радиусе 100-200 миль, поиск длится около 140 секунд, что невозможно запустить в производство.
Стек:
- Рельсы 4
- MySQL 5.5
- Geokit-рельсы драгоценный камень
Я хотел бы попросить вас о том, как ускорить поиск по географическим данным. Должен ли я реализовать поиск, аналогичный http://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
столбцы тоже, я пытался добавить к ним индексы, но время загрузки поисков осталось прежним.
3 ответа
Я бы начал с размещения комбинированного индекса по столбцам долготы и широты, например:
class AddIndexToStoresLongitudeLatitude < ActiveRecord::Migration
def up
add_index :stores, [:latitude, :longitude]
end
def down
remove_index :stores, [:latitude, :longitude]
end
end
Если ответ @spickermann не сработает, IMO, вам следует перейти на Postgres. PostGis - очень мощный инструмент с отличной производительностью. http://postgis.net/
Лучший способ решить эту проблему - использовать геопространственный индекс. Однако ни geokit
ни geocoder
поддерживать их для реляционных баз данных. rgeo
драгоценный камень делает. Это, однако, не очень хорошо задокументировано. Если вы выполняете какие-то серьезные поиски, возможно, имеет смысл делегировать эту проблему в astic_search.