Как ускорить запрос на дату и время в Mysql

0
SELECT *
FROM LOGS
WHERE datetime > DATE_SUB(NOW(), INTERVAL 1 MONTH)

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

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

  • 0
    Вам нужно вернуть все поля? Если нет, выбор только обязательных полей ускорит запрос
  • 0
    Попробуйте объявить переменную на указанную вами дату и поместить ее в предложение where вместо вычисления пальца. Это может ускорить это, может быть, не огромное количество, а некоторые. Плюс, если вы не используете все поля в таблице, не выбирайте *
Показать ещё 3 комментария
Теги:
myisam
innodb

2 ответа

1
Лучший ответ

Поскольку записи базы данных вставляются в самые старые и новейшие, вы можете создать 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 вызова.

  • 0
    Ваша идея - это то, что мне нужно. Благодарю.
  • 0
    Не беспокойся, рад, что смог помочь!
1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню