Я прочитал довольно много постов с наибольшим числом групп, но, похоже, все еще не нашел хорошего решения с точки зрения производительности. Я использую 10.1.43-MariaDB.
Я пытаюсь получить изменение значений данных за заданный период времени, поэтому мне нужно получить самую раннюю и последнюю строку из этого периода. Наибольшее количество строк во временном интервале, которое необходимо вычислить прямо сейчас, составляет около 700 тыс., И оно будет только расти. На данный момент я только что выполнил два запроса, один для самого последнего и один для самой ранней даты, но даже это в настоящее время имеет низкую производительность. Таблица выглядит следующим образом:
user_id data date
4567 109 28/06/2019 11:04:45
4252 309 18/06/2019 11:04:45
4567 77 18/02/2019 11:04:45
7893 1123 22/06/2019 11:04:45
4252 303 11/06/2019 11:04:45
4252 317 19/06/2019 11:04:45
Индексируются столбцы даты и user_id. Без упорядочения строки не в каком-либо определенном порядке в базе данных, если это имеет значение.
Дальнейшее, что я получил с этой проблемой, является запрос, подобный этому для текущего года (700k точек данных):
SELECT user_id,
MIN(date) as date, data
FROM datapoint_table
WHERE date >= '2019-01-14'
GROUP BY user_id
Это дает мне правильную дату и user_id очень быстро, примерно ~ 0.05s. Но, как и в случае с наибольшими числами для каждой группы, остальная часть строки (в данном случае данные) не совпадает с строкой с датой. Я читал о других подобных вопросах и пробовал с подзапросом, как это:
SELECT a.user_id, a.date, a.data
FROM datapoint_table a
INNER JOIN (
SELECT datapoint_table.user_id,
MIN(date) as date, data
FROM datapoint_table
WHERE date >= '2019-01-01'
GROUP BY user_id
) b ON a.user_id = b.user_id AND a.date = b.date
Этот запрос занимает около 15 секунд, чтобы получить правильное значение данных. 15-е годы слишком длинны, и я должен делать что-то не так, когда первый запрос очень быстрый. Я также попытался выполнить (MAX) - (MIN) для данных с group by для user_id, но он также имел низкую производительность.
Что может быть более эффективным способом получения того же значения данных, что и дата, или даже Разница в последних и самых ранних данных для каждого пользователя?