Sven Rautenberg: JOIN dauert mehrere Minuten (Problem: fehlende FKs ?)

Beitrag lesen

Moin!

»» Irgendwelche Indices hast du offenbar schon angelegt, sonst würde in der Spalte "possible_keys" nicht "fk_ort_keys" und "fk_name_keys" erscheinen. Die Frage wäre, was das für Indices sein sollen. Vermutlich sind sie derzeit einfach überflüssig, zumindest fk_ort_keys, aber das hängt von den anderen Abfragen ab, die du sonst noch so ausführst.

Hier allerdings mal die Grafik des zu Grunde liegenden DB Schemas:

Uii, eklig. Die Tabelle "keys" hat überhaupt keinen nachvollziehbaren Existenzgrund. Deshalb ist sie in deinem Join auch nicht enthalten, weil man sie schlicht nicht benötigt. Sie speichert ausschließlich redundante Informationen.

Die Tabellen ort und name haben key als Fremdschlüssel, der sich auf key der Tabelle keys bezieht. Die keys sind von Typ VARCHAR(8) weil der key aus Zeichen und Ziffern besteht.

Wie sind die Fremdschlüssel denn realisiert? Am besten, du postest mal das CREATE-Statement der drei Tabellen. Außerdem wären ein, zwei Demo-Datensätze, die darin gespeichert sind, nicht schlecht, so zur Anschauung.

Die Kritik von Ilja an dem Datenformat der keys bzw. deren Verwendungszweck kann ich nachvollziehen, aber nur teilweise. Tabellenverknüpfung über Schlüssel ist am performantesten, wenn man einen vernünftig indizierbaren, eindeutigen Inhalt mit möglichst kleiner Datenmenge hat. Der Klassiker ist halt ein INTEGER-Feld, das ist eindeutig hochzählbar und braucht 32 Bit = 4 Byte - sehr datensparsam und effizient. Ein VARCHAR(8) benötigt, je nach gewählter Kollation, schon mal mindestens 8, wenn nicht bis zu 24 Byte. Es ist zwar indizierbar, aber mindestens mit gefühlten Bauchschmerzen. Außerdem deutet sich durch die Mischung von Buchstaben und Zahlen irgendwie an, dass dieser Key mehr ist als nur irgendein Identifikator, er hat vermutlich auch noch irgendeine inhaltliche Bedeutung. Das mag man als DB-Designer noch weniger.

Allerdings: Man kann damit leben, solange die Indizierung existiert, funktioniert und die JOINs schnell sind - was aktuell ja das Problem darstellt. :)

- Sven Rautenberg