2012-03-29 170 views
3

我有一个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 
+4

你有'events.created_at'上的索引吗? – beny23 2012-03-29 13:03:53

+1

你有什么指数?索引将帮助排序成本,但是您需要考虑所需的顺序以及您在WHERE子句中应用的过滤器。 '(device_id,data_type,created_at DESC)'在这里是一个很好的索引,但*非常*关注于这个查询。 – MatBailie 2012-03-29 13:05:01

+0

我有解决方案..... 我需要修改查询,并缩短时间窗口! – Dabidi 2012-03-29 13:09:10

回答

0

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

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

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

那里有多少数据?它多久写一次(每个分解者)?

+0

mmm约2000万行,它会被写入每秒10-15次.... – Dabidi 2012-04-12 08:22:58