2012-03-29 140 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