У меня есть таблица мониторинга со следующей структурой:Высокий дорожный стол, оптимальные индексы?
CREATE TABLE `monitor_data` (
`monitor_id` INT(10) UNSIGNED NOT NULL,
`monitor_data_time` INT(10) UNSIGNED NOT NULL,
`monitor_data_value` INT(10) NULL DEFAULT NULL,
INDEX `monitor_id_data_time` (`monitor_id`, `monitor_data_time`),
INDEX `monitor_data_time` (`monitor_data_time`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
Это очень высокий стол трафика с потенциально тысячами строк каждой минуты. Каждая строка относится к монитору и содержит значение и время (UNIX_TIMESTAMP)
У меня есть три вопроса:
1. Внезапно, после нескольких месяцев в разработчике, стол вдруг стало очень медленно. Запросы, которые ранее выполнялись под вторым, теперь могут занимать до минуты. Я использую стандартные настройки в my.cnf, так как это dev-машина, но поведение было действительно очень странным для меня.
2. Я не уверен, что у меня есть оптимальные показатели. «Нормальный» запрос выглядит следующим образом:
SELECT DISTINCT(md.monitor_data_time), monitor_data_value
FROM monitor_data md
WHERE md.monitor_id = 165
AND md.monitor_data_time >= 1484076760
AND md.monitor_data_time <= 1487271199
ORDER BY md.monitor_data_time ASC;
EXPLAIN на запрос выше выглядит следующим образом:
id;select_type;table;type;possible_keys;key;key_len;ref;rows;Extra
1;SIMPLE;md;range;monitor_id_data_time,monitor_data_time;monitor_id_data_time;8;\N;149799;Using index condition; Using temporary; Using filesort
Что вы думаете об индексах?
3. Если я не укажу DISTINCT в запросе выше, я получаю дубликаты строк, даже если в таблице нет повторяющихся строк. Любое объяснение этому поведению?
Любой вход очень ценится!
UPDATE 1:
Новое предложение по структуре таблицы:
CREATE TABLE `monitor_data_test` (
`monitor_id` INT UNSIGNED NOT NULL,
`monitor_data_time` INT UNSIGNED NOT NULL,
`monitor_data_value` INT UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`monitor_data_time`, `monitor_id`),
INDEX `monitor_data_time` (`monitor_data_time`)
) COLLATE='utf8_general_ci' ENGINE=InnoDB;
Примечание об обновлении 1: вторичный индекс избыточен с предлагаемым первичным ключом; добавив, что это отходы. Для предикатов запроса, заданного в вопросе, мы предпочли бы, чтобы индекс с 'monitor_id' был ведущим столбцом (как я предложил в своем ответе). Если есть какая-то причина, кластерный ключ не имеет' (monitor_id , monitor_data_time) 'как ведущие столбцы, тогда нам нужен индекс * cover * как вторичный индекс' (monitor_Id, monitor_data_time, monitor_data_value) '. Есть определенные причины для моих рекомендаций; мы не просто бросаем вещи на стену, чтобы увидеть, какие палки. – spencer7593