【问题标题】:select by nearest date按最近日期选择
【发布时间】: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


    【解决方案1】:

    为什么不使用活动记录而不是 SQL 查询来执行此操作? 像这样:

    `@event = Event.where(:device_id => session[:selected_cam_id])。 其中(:data_type => '图像')。 where("created_at >= ? AND created_at

    我认为这样更有效率。

    【讨论】:

    • 这是同一件事.....执行查询需要 20-30 秒......我如何在这个查询上使用 EXPLAIN 命令?
    • 在查询末尾添加 .explain(在 .first 之后)
    【解决方案2】:

    你也可以试试这个

         @event = Event.where(:device_id => session[:selected_cam_id])
         .where(:data_type => 'image').to_a
         .select{|i| i.created_at.to_time >= params[:selected_date].to_time.beginning_of_day 
    && i.created_at.to_time <= params[:selected_date].to_time.end_of_day}
    .sort{ |x,y| y.created_at  <=> x.created_at}.first
    

    【讨论】:

    • 嗯我不明白这个:.sort_by{|x,y| y.created_at x.created_at} x 和 y 是什么?以及 oparator 如何按日期将最近的记录返回给我选择的日期?
    • 而不是使用 sort_by 使用排序方法。 sort 和 select 是数组对象的方法
    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多