MySQL оптимизирующий геометрический запрос - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть запрос, который корректно возвращает строки в пределах X миль от заданного Point() в порядке наименьшего расстояния первым, но у меня возникают проблемы при оптимизации запроса, который в настоящее время занимает 6-8 секунд, чтобы вернуть 10 строк из таблицысодержит около 250 тыс. строк.

Столбец geometry Location уже имеет пространственный индекс.

Мой текущий запрос:

SELECT *,  ROUND(ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) / 1609.344, 2) as DistanceFromTargetInMiles   
       FROM Business
       -- within 5 miles
       WHERE  ST_Distance_Sphere(Location, ST_GeomFromText('POINT(lng lat)', 4326)) /1609.344 < 5
         -- show closest results first
         order by DistanceFromTargetInMiles 
         asc LIMIT 10

Что я могу сделать, чтобыулучшить скорость этого запроса?Это MySQL 8.0.1.3

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете попытаться добавить дополнительное условие в условие where, чтобы проверить, находится ли местоположение в конверте (posX - dist / 2, posY - dist / 2), (posX + dist / 2, posY + dist / 2).Это гораздо проще вычислить, и если записи НЕ внутри конверта, они будут сразу исключены, и более дорогостоящая операция ST_Distance_Sphere не будет выполнена.

Я попытался сделать это один раз и получил улучшения.Однако я сделал это с довольно старой версией MySQL, так что, возможно, новая версия не выиграет от этого подхода.

...