я проблема производительности с этим запросом:выбрать на ближайшую дату
@event = Event.find_by_sql("
SELECT * FROM `IdeProNew_development`.`events`
WHERE device_id = #{session[:selected_cam_id]}
AND data_type = 'image'
AND created_at BETWEEN CONVERT('#{params[:selected_date].to_time.beginning_of_day}', DATETIME)
AND CONVERT('#{params[:selected_date].to_time.end_of_day}', DATETIME)
ORDER BY abs(CONVERT('#{params[:selected_date]}', DATETIME)- created_at) LIMIT 1
").first
я использовать это, чтобы выбрать ближайшее событие в «selected_date» ... это нормально, но это очень медленно, потому что сканировать все таблицу (она очень большая) и сортировать по разнице между выбранной датой и датой создания записи.
я пытаюсь использовать DATEDIFF как это:
@event = Event.find_by_sql("
SELECT * FROM `IdeProNew_development`.`events`
WHERE device_id = #{session[:selected_cam_id]}
AND data_type = 'image' AND created_at
BETWEEN CONVERT('#{params[:selected_date].to_time.beginning_of_day}', DATETIME)
AND CONVERT('#{params[:selected_date].to_time.end_of_day}', DATETIME)
ORDER BY abs(DATEDIFF(CONVERT('#{params[:selected_date]}', DATETIME), created_at)) LIMIT 1
").first`
, но это не очень хорошо работает (иногда дают мне неправильный результат), и это слишком медленно.
где моя ошибка? могу ли я использовать некоторый тип индексации, чтобы быстро выполнить этот запрос?
это одно и то же ..... 20-30 секунд, чтобы выполнить запрос .... как я могу использовать команду EXPLAIN над этим запросом? – Dabidi
Добавить .explain в конце запроса (после .first) –