排序查询结果太慢了

时间:2012-03-29 12:59:54

标签: sql ruby-on-rails sql-order-by

我在RoR应用程序的数据库中遇到大表问题。

TABLE EVENTS

create_table "events", :force => true do |t|
    t.integer  "id"
    t.integer  "device_id"
    t.string   "data_type"
    t.integer  "element_id"
    t.t.datetime "created_at"
end

问题是当我想通过此查询在此表中找到记录时:

SELECT SQL_NO_CACHE `events`.* FROM `events`
WHERE `events`.`device_id` = N AND `events`.`data_type` = 'S'
AND (`events`.`created_at` BETWEEN 'S' AND 'S')
ORDER BY events.created_at DESC LIMIT 1

我想在一天内拍摄最后一个事件,因此请按created_at订购记录并选取第一个元素。

不幸的是,排序的操作成本太高,然后查询太慢了。

MySQL必须执行额外的传递以找出如何按排序顺序检索行。

Sorting result  7.1760s 7.2565s 1176    8080    0   0

1 个答案:

答案 0 :(得分:0)

您可以维护一个事件摘要表,您可以从中获取数据吗?使用触发器填充摘要表填充它。 EVENT_SUMMARY表只包含最新的行或指向最新行的指针,因此您根本不需要在查询中进行排序。我已经在一张大约有8000万行的桌子上工作得很好而且效果很好。

要考虑的事情是,触发器会在插入时引起性能问题,因为它正在做额外的工作。

取决于有多少分解者,汇总表可能不是最好的方法。

那里有多少数据?它是多久被写入(按分解者)?