Это таблица, с которой я работаю:
CREATE TABLE IF NOT EXISTS `checklist_answer` (
`id` varchar(36) NOT NULL,
`created_by` varchar(36) NOT NULL,
`date_created` datetime NOT NULL,
`updated_by` varchar(36) NOT NULL,
`date_updated` datetime NOT NULL,
`deleted` int(11) NOT NULL,
`checklistresponse_id` varchar(36) NOT NULL,
`question_id` varchar(36) NOT NULL,
`questionoption_id` varchar(36) DEFAULT NULL,
`value` varchar(256) NOT NULL,
`source` int(11) NOT NULL,
`award_id` varchar(36) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `checklist_answer_1f92e550` (`question_id`),
KEY `checklist_answer_35e0d13d` (`questionoption_id`),
KEY `answerset` (`checklistresponse_id`,`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
В настоящее время таблица содержит около 20 миллионов строк и занимает около 12 ГБ. Всякий раз, когда я пытаюсь добавить новый индекс или удалить индекс, это занимает минимум 4 часа. Есть ли что-то вопиющее, что я делаю неправильно, или это так?
MySQL 5.1.49
Спасибо!
Если вы используете встроенный в MySQL 5.1 InnoDB, создание и удаление индекса происходит очень медленно. Это было исправлено в 5.5 с быстрые индексы. По возможности обновите MySQL. В качестве альтернативы вы можете заменить встроенный InnoDB из 5.1 на плагин InnoDB (хотя это уже должно было быть сделано; учитывая, что у вас возникла эта проблема, вероятно, почему-то не было).
Посмотрите на три 36-байтовых поля «ID», которые вы индексируете.
Сначала я бы предложил сократить эти три до 8-байтового UNSIGNED BIGINT; 4-байтовое UNSIGNED INT даже лучше, если 4-миллиардное число достаточно велико.
ЕСЛИ 4-байтовое поле INT «удалено» используется в качестве флага, его можно изменить на 1-байтовое TINYINT.
Вы можете попробовать оформить:
ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer
ОТКЛЮЧИТЬ КЛЮЧИ;
/ *
Make you table changes in here.
* /
ИЗМЕНИТЬ ТАБЛИЦУ checklist_answer
ВКЛЮЧИТЬ КЛЮЧИ;
Вместе я не удивлюсь, увидев сокращение «4 часа» вдвое.
Другие убийцы производительности: "ENGINE = InnoDB DEFAULT CHARSET = utf8;".
Измените это на: "ENGINE = MYISAM DEFAULT CHARSET = latin1;" мог бы снова сократить время вдвое.
BIGINT убивают производительность на 32-битных машинах. 64-разрядная машина будет работать с MariaDB в 2,5 раза быстрее, чем на 32-разрядной машине.