Многостолбцовый индекс или несколько индексов для таблицы временных рядов MySQL?

У меня есть таблица MySQL MyISAM с примерно 400 миллионами строк данных о ценах (данные 7 ГБ + индекс 9 ГБ) с 3 столбцами:

CREATE TABLE `prices` (
  `ts` datetime NOT NULL,
  `id` int(10) unsigned NOT NULL,
  `price` double NOT NULL,
  PRIMARY KEY (`ts`,`instrid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1$$

Количество различных id (я думаю, что кардинальность - это слово) составляет ~ 500, и для большинства интересующих временных диапазонов внутри этих временных диапазонов кардинальность id ниже ~ 20 (так что существует только 20 или около того разных идентификаторов между мартом и мартом). 1-й и 2-й).

Запросы почти всегда имеют форму:

select ts, price from prices where ts between {t1} and {t2} and id = {id}.

Кажется, что некоторые индексы должны ускорить процесс.

Будет ли лучше комбинированный индекс для ts и id или отдельные индексы для ts и id? Какая-то третья альтернатива? Я также был бы признателен за рекомендации, где я мог бы узнать, как ответить на этот вопрос для себя.

Будет ли другой тип таблицы (InnoDB?) более подходящим для моих целей?


person John Salvatier    schedule 24.02.2012    source источник


Ответы (1)


Я бы выбрал единый комбинированный индекс по ts, цене и идентификатору - обычно MySQL выполняет две операции, сначала находит строку, используя индекс, затем извлекает строку из базы данных. Однако, если у вас есть все данные в индексе, он просто захватит данные прямо из индекса, не извлекая строку из базы данных. Это называется «индекс покрытия».

При выборе базы данных большинство людей, похоже, рекомендуют InnoDB для серьезного использования, есть хорошее сравнение здесь

person user1228295    schedule 24.02.2012
comment
Согласованный. Создайте покрывающий индекс со столбцами в следующем порядке (ts, id, price). - person Marcus Adams; 25.02.2012
comment
Интересное решение. Я попробую это и взгляну на эту статью. Спасибо :) - person John Salvatier; 25.02.2012
comment
Вы знаете, будет ли проблемой, если этот индекс не поместится в памяти? - person John Salvatier; 26.02.2012