8 Stimmen

Ist die Abfrage der MySQL information_schema-Datenbank ein guter Weg, um verwandte Tabellen zu finden?

Ich habe eine Tabelle, die durch Fremdschlüssel in vielen anderen Tabellen referenziert wird. Wenn ich in meinem Programm eine dieser Zeilen löschen möchte, muss ich zunächst nach Abhängigkeiten suchen und sie dem Benutzer anzeigen - "Dieses Objekt hängt von x aus Tabelle y, z aus Tabelle q usw. ab". Außerdem erwarte ich, dass die Anzahl der Tabellen, die Fremdschlüssel zu dieser Tabelle haben, im Laufe der Zeit beträchtlich ansteigen wird.

Ist die Datenbank information_schema ein guter Weg, um nach allen Abhängigkeiten zu suchen? Ich habe versucht, eine Liste aller Tabellen abzufragen, die Fremdschlüssel zu meiner Tabelle haben, dann über das Ergebnis zu iterieren und alle Einträge aus jeder Tabelle auszuwählen, bei denen der Fremdschlüsselwert mit dem Wert übereinstimmt, den der Benutzer zu löschen versucht. Die Abfrage lautet wie folgt:

SELECT * FROM `KEY_COLUMN_USAGE` kcu
LEFT JOIN TABLE_CONSTRAINTS tc
ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.CONSTRAINT_TYPE='FOREIGN KEY'
AND (kcu.REFERENCED_TABLE_SCHEMA='db')
AND (kcu.REFERENCED_TABLE_NAME = 'testtable')

was für die Bestimmung der zu durchsuchenden Tabellen perfekt funktioniert, aber es ist sehr langsam. Die Ausführung der Abfrage dauert auf meinem Entwicklungscomputer bestenfalls 1 bis 2 Sekunden. Wenn ich sie auf meinem Produktionsserver ausführe, verringert sich die Zeit erheblich, aber sie ist immer noch recht langsam.

Ich muss wissen, ob es eine schlechte Idee ist, information_schema auf diese Weise zu verwenden. Wenn nicht, wie kann ich eine bessere Leistung aus der Abfrage herausholen. Ist die Abfrage, die ich verwende, solide, oder gibt es einen besseren Weg, dies zu tun? Wenn ja, wie sollte ich dieses Problem unter dem Gesichtspunkt der Wartbarkeit am besten angehen.

1voto

Denis de Bernardy Punkte 71628

Für den Fall, dass dies jemals bei Google gefunden wird, ist es auch erwähnenswert, dass das information_schema gelegentlich von dem abweicht, was von show create table .

Ein gutes Beispiel dafür ist dieser Artikel DBA Stack Exchange Thema . Nach der Ausführung dieses Befehls:

create table rolando (num int not null, primary key (num) using hash);

Überprüfen Sie die Ergebnisse:

mysql> show create table rolando\G
  (...)
  PRIMARY KEY (`num`) USING HASH

mysql> show indexes from rolando;
(...) | Index_type | (...)
(...) | BTREE      | (...)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X