Anzeige:
Ergebnis 1 bis 8 von 8

Thema: MySQL: Probleme mit Primary-Key

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.08.2002
    Ort
    Haiger am Niel *g*
    Beiträge
    74

    MySQL: Probleme mit Primary-Key

    Hallo zusammen,
    ich schreibe gerade ein PHP-Script zum auswerten von Logfiles.
    Eigentlich brauche ich dafür keinen primary-key, dieser stört mich eher, da ich keine ID oder sowas habe und die Berechnung solcher relativ lange dauert und ein auto_increment sehr schnell sehr groß wird (da beim neu Einlesen der Logs große Teile der DB gelöscht werden).
    Da ich jede Zeile der Logfiles in die DB lesen will dauert der Programmaufruf relativ lange, da ich etwa 200.000 Zeilen einlesen muss. Kann ich den Primary-Key weglassen? Ich habe gelernt, dass der immer da ein muss. Wäre es tragisch, wenn ich ihn weglasse?
    Geändert von ~Gh05t~ (06-06-2005 um 15:16 Uhr)
    [Workstation]Intel Core2 Duo E8400/4GB, ATI HD4830 @ kUbuntu/Win7pro
    [Server] Via Epia SP13000/512MB @ Ubuntu LTS Server
    [Mobil] Intel Pentium M 1,86Ghz/512MB/ATI X600M (Asus M6974VLP) @ xUbuntu

  2. #2
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Du solltest niemals eine Tabelle ohne primary key anlegen. Selbst wenn das dbms es dir gestattet, kannst du hinterher kaum sinnvoll mit der Tabelle arbeiten, weil ja nicht sicher ist, dass du einen bestimmten Eintrag triffst, z.B. beim update. Was du aber machen kannst:
    lege eine bigint-Spalte als primary key an und fülle den Wert aus dem Programm heraus. Du hast ja ohnehin eine Schleife zum Einlesen, da tut eine Zählvariable nicht weh. Du kannst den letzten Wert anschließend entweder in einer eigenen Tabelle speichern oder vor dem nächsten abspeichern den maximalwert ermitteln und eins raufzählen.
    Bei so massenhaftem Einspeichern halte ich das für vertretbar, denn es ist schneller als ein autoincrement der Datenbank.
    Das Ziel ist das Ziel.

  3. #3
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677
    Du kannst auch einen zusammengestzten Schlüssel verwenden, z.B. Tagesdatum + fortlaufende Nummer.

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.08.2002
    Ort
    Haiger am Niel *g*
    Beiträge
    74
    Ich brauche den Primary_Key in diesem Fall ganz sicher nicht.
    Meine Logfiles sind CSV-Files von etwa 30 verschiedenen Anlagen, die pro Zeile Datum+Zeit und den zu dieser Zeit beginnenden Status enthalten.
    Mein PHP-Script generiert aus dem Datum+Zeit ein Timestamp und schreibt Status-Begin, Status-Ende, Status, Anlagennummer in die DB. Es gibt also keine Doppelten Einträge für eine Anlage. Und ich mache auch ganz sicher keine DB-Abfragen über den Primary-Key sondern über Anlagennummer und Timestamp. Also auch keine Zeit-Nummer kombination.

    Beim Update lösche ich zunächst alle Einträge der entsprechenden Anlage, was eine Lücke in der Primary-Key folge hervorruft. Die später wieder zu füllen braucht absolut zuviel Rechenleistung.

    BTW: Was passiert, wenn der Primary-Key zu groß wird?
    [Workstation]Intel Core2 Duo E8400/4GB, ATI HD4830 @ kUbuntu/Win7pro
    [Server] Via Epia SP13000/512MB @ Ubuntu LTS Server
    [Mobil] Intel Pentium M 1,86Ghz/512MB/ATI X600M (Asus M6974VLP) @ xUbuntu

  5. #5
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Zitat Zitat von ~Gh05t~
    Ich brauche den Primary_Key in diesem Fall ganz sicher nicht.
    Meine Logfiles sind CSV-Files von etwa 30 verschiedenen Anlagen, die pro Zeile Datum+Zeit und den zu dieser Zeit beginnenden Status enthalten.
    Mein PHP-Script generiert aus dem Datum+Zeit ein Timestamp und schreibt Status-Begin, Status-Ende, Status, Anlagennummer in die DB. Es gibt also keine Doppelten Einträge für eine Anlage. Und ich mache auch ganz sicher keine DB-Abfragen über den Primary-Key sondern über Anlagennummer und Timestamp. Also auch keine Zeit-Nummer kombination.

    Beim Update lösche ich zunächst alle Einträge der entsprechenden Anlage, was eine Lücke in der Primary-Key folge hervorruft. Die später wieder zu füllen braucht absolut zuviel Rechenleistung.

    BTW: Was passiert, wenn der Primary-Key zu groß wird?
    Demnach bist du wohl inder glücklichen Lage, einen natürlichen Schlüssel benutzen zu können: timestamp und Anlagennummer.
    Du kannst diese beiden Felder als Schlüssel definieren (gemeinsam bilden sie _einen_ schlüssel) und bist aus dem schneider.
    Diese beiden lassen sich identifizieren und anhand der beiden kannst du also einen Eintrag eindeutig bestimmen.

    Eine Lücke in der primary-key folge ist übrigens unproblematisch und muss nicht gefüllt werden. Ein Primärschlüssel stellt die Einzigartikeit einer Zeile sicher, nicht die durchgängigkeit einer Zahlenfolge.
    Das Ziel ist das Ziel.

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    BTW: Was passiert, wenn der Primary-Key zu groß wird?
    Wenn Du damit einen künstlichen PK meinst, der aus einem Auto_increment Feld besteht, dann gilt:
    übersteigt der Wert eines auto_increment Feldes die Range des Datentyps, gibt es einen Fehler beim Einfügen. Es gibt KEINEN Überlauf, so dass er wieder bei 0 anfangen würde...

  7. #7
    Registrierter Benutzer
    Registriert seit
    23.08.2002
    Ort
    Haiger am Niel *g*
    Beiträge
    74
    Zitat Zitat von mwanaheri
    Demnach bist du wohl inder glücklichen Lage, einen natürlichen Schlüssel benutzen zu können: timestamp und Anlagennummer.
    Das ist natürlich eine gute Idee... Thx, das Löst mein Problem denke ich.

    Zitat Zitat von mwanaheri
    Eine Lücke in der primary-key folge ist übrigens unproblematisch und muss nicht gefüllt werden. Ein Primärschlüssel stellt die Einzigartikeit einer Zeile sicher, nicht die durchgängigkeit einer Zahlenfolge.
    Ich fände das deshalb recht sinnig, weil die Daten u.U. relativ häufig aktualisiert werden und somit die PK-Werte relativ schnell einen Überlauf hervorrufen würden. Aber das hat sich ja so erledigt


    Danke für eure Hilfe!!
    [Workstation]Intel Core2 Duo E8400/4GB, ATI HD4830 @ kUbuntu/Win7pro
    [Server] Via Epia SP13000/512MB @ Ubuntu LTS Server
    [Mobil] Intel Pentium M 1,86Ghz/512MB/ATI X600M (Asus M6974VLP) @ xUbuntu

  8. #8
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Zitat Zitat von ~Gh05t~
    Ich fände das deshalb recht sinnig, weil die Daten u.U. relativ häufig aktualisiert werden und somit die PK-Werte relativ schnell einen Überlauf hervorrufen würden.
    Wenn du die Angewohnheit hast, dauernd 200.000 Einträge hinzuzufügen, stimmt das wohl.
    Das Ziel ist das Ziel.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •