Mysql - повторно использовать вычисленные значения, такие как значение st_distance_sphere - PullRequest
0 голосов
/ 11 апреля 2020

Моя mysql (v8.0.19) тестовая таблица содержит 1000 записей местоположения. 250 из них я получаю в результате, если я запрашиваю «дать мне все userIds, которые находятся в радиусе 500 метров».

Мой первый запрос (0.033 se c) возвращает только userId:

SELECT db_user_id 
FROM db.location 
where st_distance_sphere(ST_GeomFromText('POINT(51.1065133 11.1245543)', 4326), geo) <= 500;

Мой второй запрос (0.045 se c) возвращает userId и расстояние:

SELECT db_user_id,st_distance_sphere(ST_GeomFromText('POINT(51.1065133 11.1245543)', 4326), geo) 
FROM db.location 
where st_distance_sphere(ST_GeomFromText('POINT(51.1065133 11.1245543)', 4326), geo) <= 500;

Моя догадка (почему второй запрос медленнее): st_distance_sphere вычисляется в операторе where (для 1000 записей местоположения) и снова для результата около 250 записей.

Мой вопрос: есть ли способ повторно использовать уже рассчитанную st_distance_sphere в качестве результата запроса? Есть ли такой же быстрый запрос, как первый, но возвращает идентификатор пользователя и расстояние?

1 Ответ

1 голос
/ 12 апреля 2020

Оба запроса должны выполняться WHERE 1000 раз.

Вы сокращаете второй запрос до 1000 оценок, делая его более сложным:

SELECT  user_id, dist
    FROM  
        ( SELECT  db_user_id,
                  st_distance_sphere(ST_GeomFromText(
                        'POINT(51.1065133 11.1245543)', 4326), geo
                           ) AS dist
              FROM  db.location 
        ) AS x
    WHERE  dist <= 500;

Если ваш список будет расти значительно, см. мое обсуждение дальнейшей оптимизации: http://mysql.rjweb.org/doc.php/find_nearest_in_mysql.

...