2015-04-11 4 views
1

Доброго день всем,Обновления географическая информация из другой таблицы MySQL

У меня есть проблемы с производительностью здания следующего обновления:

Таблица POI (точки интереса) содержит 10 миллионов записей с полями для оба долготы и широта (выдержка из планеты OSM)

Таблица города содержит 145000 записей большинства городов мира также с полями для обоих долготы и широты

Я хотел бы связать внешний ключ CITY_ID (не вы данные t в этом поле) в таблице POI к основному идентификатору в таблице города. Когда это будет сделано, я смогу связать все мои POI с городом. Я пробовал обратное геокодирование, но оказалось, что это плохой опыт, и я не вижу, как я мог бы изменить геокодирование 10 миллионов записей, таким образом, моя ставка, чтобы взять ближайший город к каждой POI. Но похоже, что мой SQL-запрос берется навсегда на моем новом Macbook Pro 2015 с 16 играми или оперативной памятью. Существует что-то я не делаю здесь ... Все L и длинные поля индексируются в базе данных MySQL

Я пробовал следующий запрос, чтобы сделать так:

update poi 
set (poi.city_ID, poi.distance) = 

( select city.ID, 
     MIN(111.045* DEGREES(ACOS(COS(RADIANS(poi.latitude)) 
       * COS(RADIANS(city.latitude)) 
       * COS(RADIANS(poi.longitude) - RADIANS(city.longitude)) 
       + SIN(RADIANS(poi.latitude)) 
       * SIN(RADIANS(city.latitude))))) AS distance_in_km 
    FROM city 
) 

Halp!

Cheers

Норма.

ответ

0

Индексирование на двух отдельных столбцах лат и lon, хранящихся в виде чисел с плавающей запятой, не помогает. Вам необходимо использовать пространственные функции базы данных, сохранить местоположение lat/lon в одном столбце типа географии и создать пространственные индексы в этом столбце. См. Это article для получения подробной информации о пространственных функциях MySQL.

+0

Кажется, что для использования пространственных функций мне нужно преобразовать таблицу из Innodb в MyIsam с помощью этой команды: ALTER TABLE poi ENGINE = MYISAM; но проклятый стол остается с Innodb? Что за ??? Или я мог бы обновить с MySQL 5.6 до 5.7, чтобы иметь пространственные функции с InnoDB. Не уверен, что 5.7 стабильно, но ... – Nuuzee

+0

Хорошо ... Я нахожусь здесь! :) Я сделал следующее для своей таблицы: создайте индекс idxfaster на poi (широта, долгота); И создать индекс idxfasterlong на poi (долгота); Я также добавил некоторые «WHERE» в моем запросе (ограничивающая рамка). Запрос длился от 3 секунд до ... (барабанный ролл) 0,3 секунды !!! Да ! – Nuuzee

+0

Глупо мне ... Заявление об обновлении не заняло o.3 сек !!! Я просто запросил таблицу с помощью простого выбора и пары жестко закодированной долготы и широты, чтобы увидеть, как долго выполняется один запрос :) Теперь я попробую обновление. Будьте на связи – Nuuzee

Смежные вопросы