Alt 14.12.2011, 20:03:04   #1 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard DB-Struktur hashen

Kann man eigentlich irgendwie zuverlässig und zeitsparsam eine Anfrage an MySQL stellen, um von der Strukturänderung mehrerer Tabellen bzw. derer Spalten zu erfahren? Also nicht die gesamte Information über die Struktur, sondern nur ob sich seit dem letzten Mal etwas an der Struktur geändert hat. Quasi ein Hash über die Tabellenstruktur.

Mir ist zwar gerade die Idee gekommen, dass man ja ggf. über das information_sheme abfragen könnte. Hier hat aber testweise die Darstellung der Columns-Tabelle weit über 10 Sekunden gedauert, da, wie ich vermute, dabei rechtemäßig erstmal alle Einträge des gesamten Servers geprüft werden müssen. Selbst mit WHERE auf meine Tabelle einschränke sind es immer noch über 0,6 Sekunden und damit viel zu viel.


Heute schon gepixelt
joschilein ist offline   Mit Zitat antworten
Gesponsorte Links
Alt 15.12.2011, 08:53:55   #2 (permalink)
Erfahrener Benutzer

ID: 129556
Lose-Remote

Reg: 28.02.2010
Beiträge: 439
tobomator tobomator tobomator tobomator tobomator tobomator
Standard

Kann man ein Update Operator auf eine Alter Table Operation anwenden ?
Wenn ja sollte es gehen, wenn nicht, dann nur über schema

Wer ändert seine Struktur im laufenden Betrieb, wenn auf Tabellen funktionen liegen könnten. Wird wohl nicht so bei Dir sein, aber komisch find ich das schon
tobomator ist offline   Mit Zitat antworten
Alt 15.12.2011, 09:02:58   #3 (permalink)
Shinichi Kudo
Benutzerbild von Black-Horse

ID: 82692
Lose-Remote

Reg: 03.05.2006
Beiträge: 326
Black-Horse befindet sich auf einem aufstrebenden Ast
Standard

SHOW COLUMNS sollte deine Lösung sein

http://dev.mysql.com/doc/refman/5.0/...w-columns.html
Black-Horse ist offline   Mit Zitat antworten
Alt 15.12.2011, 10:52:19   #4 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Huch, ich merke gerade, dass die zuerst fast abgeschickten zusätzlichen Absätze doch nicht unrelevant gewesen wären.

Zitat:
Zitat von tobomator Beitrag anzeigen
Kann man ein Update Operator auf eine Alter Table Operation anwenden ?
Werde ich mal probieren.

Zitat:
Zitat von tobomator Beitrag anzeigen
dann nur über schema
Dauert wie gesagt zu lange

Zitat:
Zitat von tobomator Beitrag anzeigen
Wer ändert seine Struktur im laufenden Betrieb, wenn auf Tabellen funktionen liegen könnten. Wird wohl nicht so bei Dir sein, aber komisch find ich das schon
War eher eine sehr nervenschonende Hilfe in der Entwicklungsphase. Da sind Spalten mal in ganz andere (ggf. neue) Tabellen gewandert und ich hatte mir selbst ein Ei mit Groß-/Kleinschreibung gelegt. So konnte ich dann einfach ein großes Array machen und das wurde mir automatisch auf die verschiedenen Tabellen aufgeteilt.

Mittlerweile habe ich zwar ein (hoffentlich) endgültige Form gefunden und alles direkt mit der Bestimmung zur Zieltabelle verknüpft, aber die letzten paar Baustellen bleiben noch. Beispielsweise möchte ich ganz am Ende eines Aufrufs eine Tabelle mit den Zwischenzeiten einzelner Klassen bzw. Operationen sammeln und da ggf. irgendwann mal eine weitere Spalte "einblenden" (Spalte einfügen) oder andere ausblenden (Spalte löschen). Eigentlich müsste die Tabelle die Form "(id), aufrufid, zeitname, zeit" haben, aber bevor ich da groß eine Auswertung draus bastel, würde ich das eben nur gerne im Viewer anschauen und da ist eine sichtbare Tabelle besser als viele Zeilen. Das ganze passiert aus Gründen der Zeitmessung erst wenn alles andere quasi schon abgeschaltet ist (z.B. eine ordentliche Fehlerbehandlung/-weiterverarbeitung) möchte ich hier DB-Exceptions vermeiden und vorher die tatsächlich vorhandenen Spalten sicher ermitteln.

Zitat:
Zitat von Black-Horse Beitrag anzeigen
SHOW COLUMNS sollte deine Lösung sein
Das war meine bisherige Lösung. Mit kleinem Overhead durch eine Query- und DB-Klasse und letzten kleinen Manipulationen (z.B. Ignorierung von autoincrement-Spalten) hat ein Aufruf dieser Funktion auf meinem Testsystem 20-50ms gedauert. Bei zunächst rund einem Dutzend Tabellen war das also schon ein ziemlich Zeitfaktor. Die meisten davon habe ich mittlerweile eliminiert. Mein Ziel ist die ganze Klasse in maximal 100ms abzuhandeln (bei einem Seitenaufruf passieren ja noch genügend andere Dinge), aber schon die verbleibende Vorbereitung für die Zeittabelle braucht eben schon ihre 50ms.

Aktuelle Überlegung: Ich programmiere die Vorbereitung hart und fange die DB-Exception im Fehlerfall (Spalte zu viel oder zu wenig) unausgegeben auf, lese erst dann die Spalten dynamisch aus und speichere erneut - und zusätzlich benachrichtige ich mich, dass die harte Programmierung geändert werden muss. Kostet alles Zeit, würde aber ansonsten ja eh nicht funktionieren.


Heute schon gepixelt
joschilein ist offline Threadstarter   Mit Zitat antworten
Alt 16.12.2011, 11:28:51   #5 (permalink)
Erfahrener Benutzer

ID: 217591
Lose-Remote

Aradiv eine Nachricht über ICQ schicken Aradiv eine Nachricht über MSN schicken
Reg: 20.04.2006
Beiträge: 1.543
Aradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer AnblickAradiv ist ein wunderbarer Anblick
Standard

Schau dir mal maatkit an das könnte das seien was du willst :-)

insbesondere mt-table-checksum


bzw für dich wäre wahrscheinlich mysqldiff besser weil du willst ja nur die Tabellenstrucktur abgleichen.

Aradiv

Geändert von Aradiv (16.12.2011 um 11:39:13 Uhr)
Aradiv ist offline   Mit Zitat antworten
Alt 16.12.2011, 13:27:30   #6 (permalink)
Multitalent
Benutzerbild von joschilein

ID: 9301
Lose-Remote

joschilein eine Nachricht über ICQ schicken
Reg: 05.05.2006
Beiträge: 1.414
joschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehenjoschilein genießt hohes Ansehen
Standard

Ich habe es jetzt mal wie angedeutet eingerichtet.
1. Es gibt Arrays für die momentane Tabellenstruktur. Zuerst werden nur diese bemüht.
2. Falls eine DB-Exception auftritt, weil eine Spalte angesprochen wird, die MySQL gar nicht (mehr) kennt, wird die Exception unterdrückt und wie bisher mit Show Coloumns der aktuelle Stand abgefragt. Der ganze Speicherversuch geht in die zweite Runde.
3. Gleichzeitig wird für das Backend rumgemeckert, da das kein Dauerzustand bleiben kann und gefälligst die Tabellenstruktur in PHP aktualisiert werden muss.

Ich denke das ist ein vernünftiger Kompromiss. Wenn was falsch läuft fliegt es mir weiterhin nicht sofort um die Ohren und wenn wie gewollt alles richtig läuft, wird keine dann unnötige Zeit verbraucht.


Heute schon gepixelt
joschilein ist offline Threadstarter   Mit Zitat antworten
Antwort

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[MySQL] Struktur Datenbank baserider Programmierung 8 01.07.2010 23:13:35
[S] Nickpage-Struktur (HTML) Gsus Lose4Scripts 0 14.03.2010 14:13:19
Wie funktioniert die Struktur im Hardwaregroßhandel? Die-Fackel Sonstiges 2 03.10.2009 13:07:15
(S) DB Struktur für Jagusch 2 FruchtKoenig Lose4Scripts 0 05.11.2008 12:58:35
[C++] fehler in if struktur zerberos Programmierung 6 30.01.2007 20:50:03


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11:43 Uhr.