Удаление индекса для таблицы InnoDB размером более 10 ГБ занимает более 4 часов

Удаление индекса для таблицы InnoDB размером более 10 ГБ занимает более 4 часов

Вот таблица, с которой я работаю:

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

Спасибо!

решение1

Если вы используете встроенный в MySQL 5.1 InnoDB, то создание и удаление индекса происходит очень медленно. Это было исправлено в 5.5 с помощьюбыстрые индексы. Обновите MySQL, если это возможно. В качестве альтернативы вы можетезаменить встроенный InnoDB из версии 5.1 на плагин InnoDB(хотя это уже должно было быть сделано; учитывая, что у вас возникла эта проблема, вероятно, этого по какой-то причине не было сделано).

решение2

Посмотрите на три 36-байтовых поля «ID», которые вы ИНДЕКСИРУЕТЕ.

Я бы сначала предложил сократить эти три до 8-байтового UNSIGNED BIGINT; 4-байтовый UNSIGNED INT будет даже лучше, если число в 4 миллиарда достаточно велико.

ЕСЛИ 4-байтовое поле INT «deleted» используется в качестве флага, его можно изменить на 1-байтовое TINYINT.

Вы можете попробовать выдать:


ИЗМЕНИТЬ ТАБЛИЦУ checklist_answerОТКЛЮЧИТЬ КЛЮЧИ;

/*

 Make you table changes in here.

*/

ИЗМЕНИТЬ ТАБЛИЦУ checklist_answerВКЛЮЧИТЬ КЛЮЧИ;


В целом я не удивлюсь, если «4 часа» сократятся вдвое.

Другие «убийцы производительности»: "ENGINE=InnoDB НАБОР СИМВОЛОВ ПО УМОЛЧАНИЮ=utf8;".

Изменение этого на: "ENGINE=MYISAM DEFAULT CHARSET=latin1;" может сократить время еще вдвое.

BIGINT — это «убийцы» производительности на 32-битных машинах. На 64-битной машине MariaDB будет работать в 2,5 раза быстрее, чем на 32-битной машине.

Связанный контент