Как ускорить запрос на дату и время в Mysql - PullRequest
0 голосов
/ 25 июня 2018
SELECT *
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)

У меня есть большая таблица LOGS (InnoDB). Когда я пытаюсь получить данные за прошлый месяц, запрос слишком долго ждет.

Я создал индекс для столбца datetime, но, похоже, это не помогает. Как ускорить этот запрос?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Поскольку записи в базе данных вставляются от самых старых до самых новых, вы можете создать 2 вызова.Первый вызов, запрашивающий идентификатор самой старой записи:

int oldestRecordID = SELECT TOP 1 MIN(id) 
FROM LOGS 
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)

Затем с этим идентификатором просто запросите все записи, где ID> oldRecordID:

SELECT *
FROM LOGS
WHERE ID > oldestRecordID

Это несколько вызовов, но это может бытьбыстрее, но я уверен, что вы могли бы объединить эти 2 звонка тоже.

0 голосов
/ 25 июня 2018

Вероятно, единственное, что вы можете сделать, - это создать кластерный индекс на datetime.Это обеспечит совмещение значений.

Однако я не думаю, что это решит вашу реальную проблему.Почему вы возвращаете все записей за месяц.Это много данных.

По всей вероятности, вы можете суммировать данные в базе данных и вернуть только необходимую вам информацию, а не все данные .

...