Здравствуй, многоуважаемый all!
В процессе познания истины mysql существует табличка userData с данными пользователей за определенное время.
На настоящее время в табличке 54 000 записи, планируется рост.
Ее упрощенная структура: dataTime (timestamp), id (bigint айди пользователя), data (информация пользователя в json). В структуру изменения вносить нельзя.
time и id уникальны для каждой строки.
Задача: для определнных id пользователей выбрать самые актуальные (с самой поздней датой) полные строки (со всеми столбцами).
Своими силами получились несколько вариантов:
(SELECT * FROM userData WHERE id=1 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=222 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=333 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=444 ORDER BY dataTime LIMIT 1) UNION
(SELECT * FROM userData WHERE id=555 ORDER BY dataTime LIMIT 1)
Крутой вариант, выполняется за 0.001 сек. Но с очевидным минусом при запросе с 1000 айдишниками будут хорошо расти логи, бегать длинные запросы и умирать котята, чего бы не хотелось делать.
SELECT * FROM userData WHERE (id, dataTime) IN (select id, max(dataTime) maxTime from userData b where id in (1, 222, 333, 444, 555) group by id)
Выполняется за 12 сек, зато маленький.
Нужен вариант с малым временем исполнения, изврат допускается.