Медленное время запроса при использовании sum () для связанной таблицы - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть две таблицы (пользователи и xp_points).Мне нужно получить общую сумму очков xp каждого пользователя.Но мой запрос кажется очень медленным (380 мс).Моя база данных довольно большая.Я попытался создать столбец в таблице пользователей с именем total_xp_points, а затем время запроса уменьшилось до 4,6 мс.

Но я не хочу вручную обновлять общее количество очков xp каждого пользователя.Есть ли способ оптимизировать этот запрос по скорости?

таблица пользователей

+----+-------------+-----------------+
| id |  fullname   | total_xp_points |
+----+-------------+-----------------+
|  1 | John Adams  |              22 |
|  2 | Will Smith  |               0 |
|  3 | Bob McGee   |             125 |
|  4 | Andy Briggs |               0 |
|  5 | Linda James |              20 |
+----+-------------+-----------------+

таблица xp_points

+----+---------+------------+-----------+
| id | user_id |    date    | xp_points |
+----+---------+------------+-----------+
|  1 |       1 | 2019-01-05 |        17 |
|  2 |       1 | 2019-03-07 |         5 |
|  3 |       3 | 2019-03-07 |         0 |
|  4 |       3 | 2019-01-08 |       125 |
|  5 |       5 | 2019-01-19 |        20 |
+----+---------+------------+-----------+

Этот запрос занял 380,711 мс (намного медленнее)

SELECT
    users.id as user_id,
    users.fullname,
    sum(xp_points.xp_points) AS total_xp_points
FROM
    users
INNER JOIN xp_points
    ON users.id = xp_points.user_id
GROUP BY
    user_id,
    users.fullname
HAVING
    SUM(xp_points.xp_points) > 3
LIMIT 100

Результат

+---------+-------------+-----------------+
| user_id |  fullname   | total_xp_points |
+---------+-------------+-----------------+
|       1 | John Adams  |              22 |
|       3 | Bob McGee   |             125 |
|       5 | Linda James |              20 |
+---------+-------------+-----------------+

Этот следующий запрос занимает всего 4,661 мс (*На 1025 * намного быстрее, но мне нужно вручную поддерживать total_xp_points в таблице пользователей, которую я не хочу )

SELECT
    users.id as user_id,
    fullname,
    total_xp_points
FROM users
WHERE
    total_xp_points > 3
limit 100

Это дает тот же результат, что и первый запрос (, но более быстрое время выполнения )

+---------+-------------+-----------------+
| user_id |  fullname   | total_xp_points |
+---------+-------------+-----------------+
|       1 | John Adams  |              22 |
|       3 | Bob McGee   |             125 |
|       5 | Linda James |              20 |
+---------+-------------+-----------------+

1 Ответ

1 голос
/ 19 апреля 2019

Часть вашей проблемы может быть GROUP BY.Вы можете попробовать выбрать подзапрос, например:

SELECT users.id AS user_id,
       users.fullname,
       (SELECT SUM(xp_points) FROM xp_points WHERE xp_points.user_id = users.id) AS total_xp_points
  FROM users
HAVING total_xp_points > 3
 LIMIT 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...