XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Mysql: Tabelle Ordnen, nach Integer Werten (timestamp) oder Zeitformaten? (http://xhtmlforum.de/showthread.php?t=44885)

braindead 13.03.2007 01:15

Mysql: Tabelle Ordnen, nach Integer Werten (timestamp) oder Zeitformaten?
 
Hi,
ich will eine Tabelle meiner Mysql Datanbank aufräumen, das Problem ist nicht das Aufräumen selbst (das passiert per Script) sondern die Laufzeit meiner php Scripte, die ist nämlich beschränkt. Das ist aber kein Problem denn ich kann auch einfach immer nur einen Teil der Tabelle aufräumen lassen (ich lasse das dann per Cronjob starten) dafür habe ich mir überlegt das die Tabelle eine zusätzliche Spalte bekommt in welcher ich entweder irgenteine Form von Datum oder Zeit Wert eintrage (Date, Time oder Datetime Typ) oder ich verwende einen INT Wert und trage für jede Abgearbeite Zeile dort die aktuelle Zeit im Timestamp format ein also dieses UNIX Format welches die Zeit in Sekunden seit dem beginn des UNIX Zeitalters angibt. Ich lasse das Script dann nur die X Zeilen bearbeiten welche das älteste Datum haben. Mit dieser Select Anfrage:
Code:

SELECT * FROM tabelle ODER BY zeitwert ASC LIMIT 100
so ungefähr. Meine Frage ist nun was geht schneller (die Datenbank muss die Zeilen ja Ordnen):
1. ein Tabelle nach Integerwerten (welche dann Timestamp Werte sind) zu ordnen
oder
2. Die Tabelle direkt nach Datums oder Zeit Formaten zu ordnen, wenn ja welches eignet sich am besten?
oder gibt es
3. noch eine Bessere Methode die schon abgearbeiteten Zeilen erst dann wieder an die Reihe kommen zu lassen nachdem alle anderen Zeilen dran waren?

maruerru 13.03.2007 23:09

Hallo braindead,

ich bin's wieder.

Bei der obigen Abfrage ist das eigentlich egal. Wenn du einen Primary-Index mit auto-increment hast, dann benutze doch den. Die zeitliche Reihenfolge steckt ja im Primary-Index mit drinnen. Größere Wert bedeutet später.

Der Vorteil von Integer ist, daß der benötigten Speicherplatz kleiner ist als bei Datumsangaben.

Du kannst die SELECT-Abfrage auch in eine Schleife hängen und den Script-timeout mittels "set_time_limit(Wert in Sekunden)" verlängern. Habe es so für ein Import-Skript gemacht, daß manuell angestoßen wird und dann durchaus eine Stunde läuft. Funktioniert allerdings nicht im Safemode.

Was willst du eigentlich aufräumen?

Gruß maruerru

braindead 14.03.2007 12:39

Es soll wie gesagt kein einmaliges Aufräumen sein, sondern wie für ein Aufräumen so üblich, soll es immer wieder passieren. Um es etwas konktreter zu machen, ich habe mehrere Tabellen in der Datenbank und bestimmte Werte, die häufig verwendet oder benötigt werden und nicht unbedingt in Echtzeit zur verfügung stehen müssen, aber selber Kondensate aus ganzen Datensätzen darstellen. Deshalb will ich einfach schon direkt in die Tabelle den zugehörigen Objekten diese Werte zuordnen, in schon fertig berechneter Form. Und weil sie die anderen Tabellen aus dehnen sich diese Werte berechnen lassen ständig ändern, muss eben die Tabelle, sobald sie einmal von vorne bis hinten "aufgeräumt" ist wieder von vorne beginnen. Deshalb eignet sich auch der Primary Key oder die Spalten ID auch nicht.

inta 14.03.2007 13:22

Bevor ich fürs aufräumen irgendeinen extra Wert in die Datenbank schreibe, würde ich mir einfach im Aufräumskript die zuletzt bearbeitete ID merken -> irgendwo zwischenspeichern.

braindead 14.03.2007 13:50

Das Problem ist aber das die Objekt Tabelle auch immer wieder neue Einträge bekommt, und die neusten Einträge sind dann auch gleich was die Aufräumwerte angeht, auf dem neusten Stand d.h. das Skript würde, wenn es nach der ID geht, die neusten Einträge noch von den alten die eben nicht so aktuell sind machen, und im Schlimmsen Fall kommen dann zwischen den Aufräumschritten soviele neue Einträge dazu das das Skript nur immer die neusten Einträge bearbeitet, weil es ja die mit der höhsten/nächsten ID sind.

inta 14.03.2007 15:26

Da hast du natürlich recht. Dann würde ich zum Timestamp greifen, da du diesen Wert ja scheinbar eh nur für die Aufräumaktion brauchst und ein Integer am leichtesten sortieren kannst. Neuen Einträgen musst du dann aber beim erstellen gleich einen Timestamp mitgeben, damit sich diese nahtlos in deine Aufräumkette einreihen.
(Man könnte den Wert auch leer lass und bei einem leeren Eintrag nochmal nach ID sortieren)

netspy 14.03.2007 18:45

Ein TIMESTAMP ist eher ungünstig, da der immer automatisch aktualiert wird, wenn man den Datensatz ändert - also nicht nur beim Aufräumen. Wenn also während dem Aufräumen die Datensätze anderweitig geändert werden, ist der TIMESTAMP auch aktuell und das Aufräumscript würde den Datensatz nicht mehr berücksichtigen.

Mario

inta 14.03.2007 18:51

Mit Timestamp ist hier ein Unix-Timestamp gemeint und den kann er in ein Feld vom Typ int packen.

netspy 14.03.2007 20:21

Schadet aber trotzdem nicht, das noch mal zu erwähnen, da das nicht jeder weiß und es später zu schwer auffindbaren Fehlern führen kann.

Mario


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:17 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023