медленный выбор запроса в большой таблице - PullRequest
1 голос
/ 29 марта 2012

У меня проблема с огромной таблицей в базе данных приложения 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».

Что я могу сделать? Я должен был думать о:

  1. изменить первичный ключ, но у RoR нет составного первичного ключа.
  2. разделить таблицу событий на множество таблиц, по одной для каждого устройства. Как? Кем станет ассоциация? (Таблица has_many?)
  3. могу ли я связать таблицу строкой? например "Events".where(...)?

Кто-нибудь может мне помочь?

Извините за мой английский. до свидания. Давиде Лентини

Ответы [ 2 ]

1 голос
/ 29 марта 2012

То, что вы не должны использовать составной первичный ключ, не означает, что вы не можете добавить составной индекс (в новой миграции):

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
1 голос
/ 29 марта 2012

Почему бы просто не создать индекс по столбцам device_id, data_type, element_id?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...