Добавление составных индексов в таблицу MYSQL - PullRequest
1 голос
/ 23 апреля 2011

У меня есть такая таблица

CREATE TABLE IF NOT EXISTS `billing_success` (
`bill_id` int(11) NOT NULL AUTO_INCREMENT,
`msisdn` char(10) NOT NULL,
`circle` varchar(2) NOT NULL,
`amount` int(11) NOT NULL,
`reference_id` varchar(100) NOT NULL,
`source` varchar(100) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`bill_id`),
KEY `msisdn` (`msisdn`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8573316 ;

, и я хочу добавить составные индексы для оптимизации запросов.Это таблица, из которой я генерирую отчеты, в последнее время она становится очень медленной.Это мои запросы для генерации отчетов

1.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='XX' OR source='Y' OR source='STR') AND (time like '$date%')

2.SELECT msisdn,amount,circle FROM billing_total_success WHERE source <> 'RNH' AND source <> 'STR' AND source <> 'XAS' AND source <> 'RTR' AND (time like '$date%')

3.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='STR' OR source='RER' OR source='ASD') AND time BETWEEN  '$date1' AND '$date2'

4.SELECT msisdn,amount,circle FROM billing_total_success WHERE (source='RNH') AND time BETWEEN  '$date1' AND '$date2'

Скажите, пожалуйста, куда мне добавить индексы для этих запросов, которые нужно оптимизировать, и как добавить правильный индекс для запроса.

1 Ответ

1 голос
/ 23 апреля 2011

A.Вы, вероятно, хотите индекс в поле отметки времени.

Однако это не обязательно конец истории;если ваши запросы сканируют диапазон по индексу метки времени, то его использование в качестве вторичного индекса не обязательно является хорошей идеей в InnoDB.

B.Сделать отметку времени первой части первичного ключа

Это нелогично, но поскольку кластеры InnoDB на первичном ключе, имея отметку времени первой части первичного ключа, превратят сканирование диапазона вторичного индекса в первичное.сканирование диапазона клавиш, что в целом лучше.Вторичное сканирование диапазона индекса должно извлекать каждую строку в диапазоне;Сканирование первичного ключа восстановило его уже .

C.Разделение по времени

Если ваши запросы медленные, поскольку таблица становится слишком большой для памяти (часто требуется чтение операций ввода-вывода), но вы всегда запрашиваете небольшой (ish) интервал времени, рассмотрите возможность создания ежедневных или часовых разделов.

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

Разделение требует, чтобы сценарии выполняли текущее обслуживаниетаблицы (создание новых разделов; удаление старых).Вы должны предоставить и протестировать эти сценарии, так что это явно накладные расходы для разработчика.Операции также должны отслеживать эти сценарии, поэтому у них тоже есть накладные расходы.

...