Das Löschen des Indexes einer InnoDB-Tabelle mit über 10 GB dauert über 4 Stunden

Das Löschen des Indexes einer InnoDB-Tabelle mit über 10 GB dauert über 4 Stunden

Dies ist die Tabelle, mit der ich arbeite:

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;

Derzeit hat die Tabelle etwa 20 Millionen Zeilen und ist etwa 12 GB groß. Immer wenn ich versuche, einen neuen Index hinzuzufügen oder einen Index zu löschen, dauert es mindestens 4 Stunden. Mache ich etwas offensichtlich falsch oder ist das einfach so?

MySQL 5.1.49

Danke!

Antwort1

Wenn Sie das in MySQL 5.1 integrierte InnoDB verwenden, sind die Indexerstellung und -löschung sehr langsam. Dieses Problem wurde in 5.5 behoben mitschnelle Indizes. Aktualisieren Sie MySQL, wenn möglich. Alternativ können SieErsetzen Sie das eingebaute InnoDB von 5.1 durch das InnoDB Plugin(obwohl dies bereits geschehen hätte sein sollen; angesichts Ihres vorliegenden Problems ist es wahrscheinlich nicht geschehen).

Antwort2

Sehen Sie sich die drei 36-Byte-ID-Felder an, die Sie indizieren.

Ich würde zunächst vorschlagen, diese drei auf ein 8-Byte-UNSIGNED BIGINT zu reduzieren; 4-Byte-UNSIGNED INT ist sogar noch besser, wenn eine 4-Milliarden-Zahl groß genug ist.

WENN das 4-Byte-INT-Feld „gelöscht“ als Flag verwendet wird, kann dies in ein 1-Byte-TINYINT geändert werden.

Sie können Folgendes versuchen:


Tabelle ändern, checklist_answerSchlüssel deaktivieren;

/*

 Make you table changes in here.

*/

ALTER TABLE checklist_answerENABLE KEYS;


Insgesamt würde es mich nicht überraschen, wenn die „4 Stunden“ halbiert würden.

Weitere Leistungskiller sind: „ENGINE=InnoDB STANDARD-ZEICHENSATZ=utf8;“.

Eine Änderung in „ENGINE=MYISAM DEFAULT CHARSET=latin1;“ könnte die Zeit noch einmal halbieren.

BIGINTs sind Leistungskiller auf 32-Bit-Maschinen. Auf 64-Bit-Maschinen wird MariaDB 2,5-mal schneller ausgeführt als auf 32-Bit-Maschinen.

verwandte Informationen