sql - 排序查询结果太慢

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

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

表事件:

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

最佳答案

您可以维护一个事件汇总表,也许您可​​以从中获取数据?使用触发器填充它以填充汇总表。 EVENT_SUMMARY 表将只包含最新行或指向最新行的指针,因此您根本不需要在查询中进行排序。我已经在一个有大约 8000 万行的表上运行得很好,而且运行良好。

不过需要考虑的是,触发器会在插入时导致性能问题,因为它正在做额外的工作。

根据汇总表中有多少分解器可能不是最好的方法。

里面有多少数据?它多久被写入一次(每个分解器)?

关于sql - 排序查询结果太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925857/

相关文章:

PHP MySQL 获取表 ORDER 后的行 ID

sql - 如何将多个默认行插入到 PostgresQL 中的表中

css - 在索引页中渲染一个 show Action - rails

MySQL:使用另一个表中的两个计数进行排序?

c# - parent 和 child 的 Linq 订单

javascript - 如何在预览图像上添加复选框

mysql - 如何将第三个条件放入 mysql 查询中

mysql - SQL查询,不包括前5条记录

java - 将 ResultSet 中的数据添加到 jTable

ruby-on-rails - Ruby on Rails 十进制列