У меня есть MySQL-процедура, которая получает записи в радиусе 50 миль при передаче Широта и долготы с использованием уравнения Хаверсина.Поиск по радиусу Zipcode с POINT Столбец
Несмотря на то, что это работает отлично и довольно быстро (учитывая, что он просматривает записи 82k), я думаю, что я могу получить лучшую производительность, создав аналогичную процедуру, используя столбец POINT.
Так, в моей таблице я создал дополнительный столбец Location
, дал ему тип данных POINT, обновил свои данные, чтобы передать широчайшие & LON к Location
колонку. Данные верны, и это хорошо., И добавил Spatial Index
Вопрос заключается в том, как я могу преобразовать следующий запрос использовать Location
колонку, вместо lat
и lon
колонн.
SET @LAT := '37.953';
SET @LON := '-105.688';
SELECT DISTINCT
BPZ.`store_id`,
3956 * 2 * ASIN(SQRT(POWER(SIN((@LAT - abs(Z.`lat`)) * pi()/180/2),2) + COS(@LAT * pi()/180) * COS(abs(Z.`lat`) * pi()/180) * POWER(SIN((@LON - Z.`lon`) * pi()/180/2), 2))) as distance,
c.`name`,c.`address`,c.`city`,c.`state`,c.`phone`,c.`zip`,c.`premise_type`
FROM
`zip_codes` as Z,
`brand_product_zip` as BPZ
LEFT JOIN `customers` c ON c.`store_id` = BPZ.`store_id`
WHERE
BPZ.`zip` = Z.`zip`
AND
3956 * 2 * ASIN(SQRT(POWER(SIN((@LAT - abs(Z.`lat`)) * pi()/180/2),2) + COS(@LAT * pi()/180) * COS(abs(Z.`lat`) * pi()/180) * POWER(SIN((@LON - Z.`lon`) * pi()/180/2), 2))) <= 50
ORDER BY
distance LIMIT 20
Я понимаю, что это было предложено ранее, однако, все, что я вижу точки для расчетов, основанных на lat
и lon
и не POINT
колонке
Обновлено Код:
SET @lat = 41.92;
SET @lon = -72.65;
SET @kmRange = 80.4672; -- = 50 Miles
SELECT *, (3956 * 2 * ASIN(SQRT(POWER(SIN((@lat - abs(`lat`)) * pi()/180/2),2) + COS(@lat * pi()/180) * COS(abs(`lat`) * pi()/180) * POWER(SIN((lon - `lon`) * pi()/180/2), 2)))) as distance
FROM `zip_codes`
WHERE MBRContains(LineString(Point(@lat + @kmRange/111.1, @lon + @kmRange/(111.1/COS(RADIANS(@lat)))), Point(@lat - @kmRange/111.1, @lon - @kmRange/(111.1/COS(RADIANS(@lat))))), `Location`)
Order By distance
LIMIT 20
если вы можете геокодировать вам данные в точку, как о только собирается после скажем, LIMIT 5 или тому подобное по вашему запросу, когда вы идете после нескольких близких точек. – Drew
действительно не уверен, что вы говорите и как это относится к моему вопросу. Мне нужно 20 записей назад, поэтому «LIMIT 20» – Kevin
о, я даже не смотрел на ваш лимит, извините. поэтому у вас есть данные точки в вашем db. вы создаете и индексируете на нем, и это фокус вашего предложения where в select (не lat и longitude) – Drew