Geokit-rails + MySQL: как ускорить поиск по широте и долготе?

У меня есть таблица базы данных, которая содержит столбцы хранения latitude а также longitude координаты (оба имеют decimal тип данных). В таблице около 500 тыс. Строк, через которые производятся поиски.

Проблема состоит в том, что если я ищу строки, которые находятся в радиусе 100-200 миль, поиск длится около 140 секунд, что невозможно запустить в производство.

Стек:

  1. Рельсы 4
  2. MySQL 5.5
  3. 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.

Другие вопросы по тегам