2017-09-19 1 views
1

Ich brauche etwa 400 Zeilen aus der MySQL-Tabelle mit Spalten löschen:Warum blockiert das Löschen vieler BLOBs die MySQL-Datenbank mit dem Status: Erzwingen des Dict-Cache-Limits?

id - INT(11) training_id - INT(11) estimator_blob - LONGBLOB

Die Größe estimator_blob ist 32 MB.

Es scheint, dass eine Abfrage wie folgt:

DELETE FROM estimator WHERE training_id IN (1, 2, ..., 400);

die Datenbank sperrt. Nach dem Ausführen dieser Abfrage werden alle neuen Abfragen, die Ergebnisse in diese Tabelle einfügen, extrem langsam ausgeführt.

In dem Status der Datenbank (mysql> SHOW ENGINE INNODB STATUS;) Ich habe diese Nachricht:

Process ID=2600, Main thread ID=139974149678848, state: enforcing dict cache limit

Was genau bedeutet "dict Cache-Grenze durchzusetzen"? Ist das der Grund für dieses "Schloss"?

Erhöhung der innodb_buffer_pool_size hat nicht geholfen.

Ich benutze MySQL 5.7.19-0ubuntu0.16.04.1 auf der Maschine mit 70 GB RAM.

+0

ist trainings_id indiziert? Sie könnten auch versuchen, * erhöhen die Gesamtzahl der Dateizugriffsnummern für MySQL verfügbar * Erhöhung der Anzahl der Datei behandelt für InnoDB –

+0

Ja, ist es. Eigentlich ist es ein Fremdschlüssel und ich benutze 'ON DELETE CASCADE' nicht. OK, ich werde es versuchen. Vielen Dank! –

Antwort

1

enforcing dict cache limit ist ein Hintergrundstatus für InnoDB-Prozesse. In diesem Zustand prüft InnoDB, ob Tabellenspeicher (z. B. Tabellenmetadaten) belegt sind, und verbraucht bei Bedarf den Cache des Verzeichnisses.

Gemäß der Anleitung zur Verfügung gestellt von MySQL-Entwicklern für bug report 84424:

Sie haben, um einige Dinge zu tun, um das Problem zu lindern:

  • erhöht den zusätzlichen Speicherpool
  • Anstieg Gesamt Anzahl der für MySQL verfügbaren Dateizugriffsnummern
  • Anzahl der Dateihandles für InnoDB erhöhen
  • Leistung des I/O auf Ihrem Betriebssystem verbessern

Sie wahrscheinlich benötigen, um Ihre Server neu zu starten vollständig aus der Ausgabe zu erholen.

+0

Ugh. Die andere Lösung könnte darin bestehen, sie in 1-Zeilen-Löschungen mit autocommit = ON aufzuteilen. –

Verwandte Themen