#mysql #sql
#mysql #sql
Вопрос:
Я написал следующий запрос, но это занимает много времени. Я пытаюсь получить последние записи, вставленные в мою pm_data_records
таблицу для каждого узла. Узлы хранятся в pm_info
таблице, по одной строке на узел.
Я написал запрос, и я думаю, что он извлекает нужные мне данные, но это занимает 15 секунд.
Обратите внимание, что у меня более миллиона записей.
Вот запрос:
SELECT
info.pm_detail_id,
... ,
info.pm_min_pressure,
datas.`pm_detail_id`,
... ,
MAX(pm_sent_time)
FROM
`pm_data_records` as datas
RIGHT JOIN pm_info as info
ON datas.pm_detail_id = info.pm_detail_id
GROUP BY
info.pm_detail_id
ORDER BY
info.pm_detail_id
tnx много
Комментарии:
1. Большинству людей
main table left join optional data
гораздо проще понять, чемoptional data right join main table
.2. Обычно вы ГРУППИРУЕТЕСЬ ПО тем же столбцам, которые вы ВЫБИРАЕТЕ, за исключением тех, которые являются аргументами для функций set.
3. @jarlh группировка по — это потому, что я хочу последнюю запись каждого узла, а не только последнюю запись, хранящуюся в
pm_data_records
. tnx для комментариев, хотя 😉4. Ваша текущая ГРУППА ПО запросу не является допустимым SQL, вызовет ошибку в более новых версиях MySQL.
Ответ №1:
Ваш запрос неверен — предложения GROUP BY
и SELECT
несовместимы. Вот правильная версия:
SELECT i.*, dr.*
FROM pm_info i LEFT JOIN
pm_data_records dr
ON i.pm_detail_id = dr.pm_detail_id AND
dr.pm_sent_time = (SELECT MAX(dr2.pm_sent_time)
FROM pm_data_records dr2
WHERE dr2.pm_detail_id = dr.pm_detail_id
);
Теперь, когда у вас есть разумный запрос, вы можете работать над его оптимизацией. Для этого запроса требуется индекс на pm_data_records(pm_detail_id, pm_sent_time)
.
Комментарии:
1. каким-то образом оба запроса извлекают одинаковый объем данных, но ваш занимает более 90 секунд! Я демонстративно ищу тот, который занимает намного меньше времени, может помочь мне оптимизировать один из запросов?
2. @arian.s . . . Этот запрос является правильным SQL. Именно с этого вам следует начать с оптимизации.