我在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”中的主键。
我该怎么办? 我不得不考虑:
has_many
?)"Events".where(...)
?任何人都可以帮助我吗?
抱歉我的英文。再见。 Davide Lentini
答案 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