Подтвердить что ты не робот

Оптимизировать запрос mysql типа Tinder

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

  • Находит ближайших пользователей, используя таблицу latlong POINT (таблица pos).
  • Удаляет пользователей, которые уже были оценены (прокрутка таблицы).
  • Объединение результатов в таблицу users.

например. найти людей около POINT (95,95) для пользователя с id = 1 (упрощенные значения latlong)

SELECT users.id, name, email, gender, birthyear, latlong FROM (
SELECT * FROM (
    # Find nearby users.
    SELECT * FROM pos
        WHERE X(latlong) BETWEEN 90.0 AND 100.0
        AND Y(latlong) BETWEEN 90.0 AND 100.0
) AS nearby WHERE owner NOT IN (
    # Find users already rated.
    SELECT target FROM swipes WHERE owner = 1
) AND id != 1
) AS unratedNearby JOIN users ON unratedNearby.owner = users.id;

Все это работает отлично, но меня беспокоит сложность этого запроса и его масштабирование. У меня есть SPATIAL KEY 'latlong' ('latlong') на таблице pos (я понимаю, что это неоптимальный способ найти близких пользователей, но точность здесь не так важна). Любой пользователь может иметь бесконечное количество проверок.

Будет ли этот запрос распадаться после того, как таблицы пользователей и swipes начнут становиться очень большими? Существуют ли какие-либо индексы, которые я должен использовать помимо пространственного ключа?

4b9b3361

Ответ 1

Ваш запрос кажется слишком сложным для этой простой задачи. Также ваш метод поиска близлежащих пользователей кажется действительно неточным для поиска людей. Рассматривайте этот запрос с помощью формулы haversine как функции расстояния (примерами этих функций могут быть легко найти в Интернете)

SELECT user_id,name,email,gender,birthyear,latlong,distance(latlong) as      
distance
FROM pos p left join swipes s on p.user_id = s.owner
WHERE target_id is NULL
ORDER by distance asc

Этот запрос может быть неправильным, потому что вы не предоставили свои инструкции create table. Но логика правильная. Вы присоединяетесь к таблице позиций пользователей на таблице прокруток и берете строки без записей, чем вы заказываете свои результаты по расстоянию, чтобы получить близких людей.

Ответ 2

Масштабирование - это проблема с "найти ближайшую". Наивные растворы представляют собой O (N * N); большинство решений O (N).

Вот решение, но оно связано с реструктуризацией данных. Это O (1). Пример кода находится в блоге.

Ответ 3

Считаете ли вы использование GAE Search API для извлечения "ближайших" пользователей и затем запрос для пользователей в этом списке для swiped?