在大表中慢选择查询

时间:2012-03-29 10:33:37

标签: sql ruby-on-rails

我在RoR应用程序的数据库中存在大量表的问题。 这是我的MySql数据库的一部分:

表设备:

create_table "devices", :force => true do |t| t.string "mac" end

表事件:

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

设备has_many事件,所以此表非常大。

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

SELECT SQL_NO_CACHE 
    element_id, 
    created_at, 
    device_id, 
    multimedia_id 
FROM events 
WHERE device_id = N 
  AND data_type = 'S' 
  AND element_id = N 
LIMIT N

问题是: 这里没有使用索引。在这种情况下,这意味着扫描930447行..

实际上,“id”中的主键。

我该怎么办? 我不得不考虑:

  1. 更改主键但RoR没有复合主键。
  2. 将事件表分成许多表,每个设备一个。怎么样?该协会将成为什么? (表has_many?)
  3. 我可以用字符串链接表吗?例如"Events".where(...)
  4. 任何人都可以帮助我吗?

    抱歉我的英文。再见。 Davide Lentini

2 个答案:

答案 0 :(得分:1)

为什么不在列device_id, data_type, element_id上创建索引?

答案 1 :(得分:1)

仅仅因为您不应该使用复合主键并不意味着您无法添加复合索引(在新的迁移中):

def self.up
  add_index :events, [:device_id, :data_type, :element_id], :name => 'my_events_index'
end

def self.down
  remove_index :events, :name => 'my_events_index'
end