【发布时间】:2012-04-15 22:42:38
【问题描述】:
我遇到了这个查询的性能问题:
@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`
但它不是很好用(有时给我一个错误的结果)而且它也很慢。
我的错误在哪里?我可以使用某种类型的索引来加快这个查询吗?
【问题讨论】:
标签: ruby-on-rails date select datediff