У меня проблема с огромной таблицей в базе данных приложения 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
У устройства есть события-многие, поэтому эта таблица очень большая.
проблема в том, когда я хочу найти запись в этой таблице по этому запросу:
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».
Что я могу сделать?
Я должен был думать о:
- изменить первичный ключ, но у RoR нет составного первичного ключа.
- разделить таблицу событий на множество таблиц, по одной для каждого устройства. Как? Кем станет ассоциация? (Таблица
has_many
?)
- могу ли я связать таблицу строкой? например
"Events".where(...)
?
Кто-нибудь может мне помочь?
Извините за мой английский. до свидания.
Давиде Лентини