SELECT *
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
У меня есть большой стол LOGS (InnoDB). Когда я пытаюсь получить данные за прошлый месяц, запрос слишком долго ждет.
Я создал индекс для столбца datetime, но, похоже, он не помогает. Как ускорить этот запрос?
Поскольку записи базы данных вставляются в самые старые и новейшие, вы можете создать 2 вызова. Первый вызов, запрашивающий идентификатор самой старой записи:
int oldestRecordID = SELECT TOP 1 MIN(id)
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)
Затем с этим ID просто запросите все записи, где ID> oldestRecordID:
SELECT *
FROM LOGS
WHERE ID > oldestRecordID
Это несколько вызовов, но это может быть быстрее, но я уверен, что вы можете объединить эти 2 вызова.
Вероятно, единственное, что вы можете сделать, это создать кластерный индекс в datetime
. Это обеспечит совместное расположение значений.
Однако я не думаю, что это решит вашу настоящую проблему. Почему вы возвращаете все записи с месяца. Это много данных.
По всей вероятности, вы можете суммировать данные в базе данных и только возвращать требуемую информацию, а не все данные.