2012-02-24 2 views
0

У меня есть MyISAM таблицы MySQL с около 400 миллионов строк данных цен (7GB данные + индекс 9ГБ) с 3-мя столбцами:Многоколоночный индекс или несколько индексов для таблицы MySQL MySQL.

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 (поэтому между 1 и 2 марта существуют только 20 или более разных идентификаторов).

Запросы почти исключительно в виде:

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

Похоже, что какой-то индекс (ы) должны ускорить процесс.

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

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

ответ

3

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

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

+1

Согласованы. Сделайте индекс покрытия столбцами в следующем порядке: '(ts, id, price)'. –

+0

Интересное решение. Я попробую это и взглянем на эту статью. Спасибо :) –

+0

Знаете ли вы, будет ли это проблемой, если этот индекс не поместится в память? –