Max () занимает довольно много времени, есть ли альтернативный способ написать этот запрос? - PullRequest
0 голосов
/ 23 апреля 2020

Я написал запрос MySQL, который отлично работает в соответствии с потребностями. Я пытаюсь найти последние записи по часам и минутам. Например:

id, date, value, ip
1 2020-04-22 21:10:14 10 123
2 2020-04-22 21:20:14 20 123
3 2020-04-23 15:26:14 30 123
4 2020-04-23 15:50:14 40 123
5 2020-04-23 18:30:14 50 123
6 2020-04-24 11:05:14 60 123
7 2020-04-24 11:15:14 70 123

Итак, мой запрос вернется:


id, date, value

2 2020-04-22 21:20:14 20 123
4 2020-04-23 15:50:14 40 123
5 2020-04-23 18:30:14 50 123
7 2020-04-24 11:15:14 70 123

Вот мой запрос:

FROM table_name
WHERE id IN (
SELECT MAX(id)
FROM table_name
WHERE ip = '12345'
GROUP BY HOUR(`date`), DATE(`date`)
)
ORDER BY id DESC; 

В моей таблице миллионы записей, я Я пытаюсь выяснить путь через запрос. В противном случае у меня есть другой способ сделать это Cron Jobs.

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете попробовать коррелированный подзапрос для фильтрации:

select t.*
from table_name t
where t.id = (
    select max(t1.id)
    from mytable t1
    where 
        t1.ip = 12345
        and t1.date >= date_format(t.date, '%Y-%m-%d %h:00:00')
        and t1.date <  date_format(t.date, '%Y-%m-%d %h:00:00') + interval 1 hour
)

Для выполнения этого запроса вам нужен индекс на (ip, date, id).

...