У меня есть две таблицы (пользователи и 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 |
+---------+-------------+-----------------+