[MySQL 4.1] Große Tabelle auf unique reduzieren

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL 4.1] Große Tabelle auf unique reduzieren

    Hallo,

    hab ein Problem und würde mich freuen, wenn mir hier jemand etwas weiter helfen könnte, da mySQL für mich quasi ein buch mit sieben siegeln ist:

    hab eine table mit ca. 600MB größe und 6 mill einträgen. Nun sind diese jedoch nicht alle unique, wobei für mich wichtig ist, daß 2 spalten, nämlich id und keyw unique sind (während es bei den anderen egal ist).

    Daher dachte ich am einfachsten wird es sein, die tabelle einfach in ne neue einzufügen bei der ich das feld id und keyw auf unique setze.

    Hab somit das versucht:
    insert into new_table select * from old_table

    bekomme aber immer den fehler:
    #1062 - Duplicate entry 'cellvalue' for key 2

    Scheint wohl so zu sein, daß mysql sich selbst stoppt wenn der erste nicht-unique value auftritt.

    Hat irgendeiner ne Idee wie ich das beheben kann? Und hat eventuell noch jemand ne idee wie ich während des Übertragens bei werten in der spalte keyw die einen Bindestrich enthalten, diesen durch ein leerzeichen ersetzen kann?

    Zu guter letzt noch: Hab das ganze mit einer php-lösung versucht (weil ich eben nicht weiß wie man obig angeführtes Ersetzen über mysql macht) und das ist so was von langsam, da mysql so sehr lahmt, doch eigentlich sollten doch 600 MB nicht so tragisch sein, oder? Ich mein das ganze läuft auf einem AMD 3,8 Dual Core mit 2 GB Ram unter Debian und der server arbeitet rein dafür (soll heißen es geschieht sonst gar nichts am server ausser dem script). Hat irgendwer tips wie man das verbessern könnte?

    Danke im Voraus

  • #2
    1. schau mal unter http://dev.mysql.com/doc/refman/5.0/en/delete.html nach "remove duplicates" in den user comments. mit den gleichen suchbegriffen http://free.netartmedia.net/Databases/Databases8.html, etwas auführlicher.

    2.
    Und hat eventuell noch jemand ne idee wie ich während des Übertragens bei werten in der spalte keyw die einen Bindestrich enthalten, diesen durch ein leerzeichen ersetzen kann?
    REPLACE() nach dem übertragen.

    3.
    ... da mysql so sehr lahmt, doch eigentlich sollten doch 600 MB nicht so tragisch sein, oder?
    etwas ungünstig aufgebaute datenbank kann schnell dazu führen, aber sobald php ins spiel kommt und man keine erfahrung mit leistungsoptimierung hat, wird's schnell langsam (tm). hatte mal eine datenbank mit wenigen hundert tausend einträgen verarbeiten müssen und erst mal mit php auf die schnelle zusammengeschrieben. wurde mir zu langsam, habe abgebrochen, das selbe in java implementiert, lief ca. 4 mal schneller. also - keine pauschalantwort möglich.

    Kommentar


    • #3
      danke für die tips das erstellen der unique DB hat geklappt mit alter ignore...

      aber die table ist noch immer so extrem langsam... was ich auch nicht verstehe, wenn ich über putty->top die load anschaue geht die hoch auf 4 wobei sowohl cpu als auch ram nicht annähernd ausgelastet erscheinen...

      Tasks: 88 total, 1 running, 85 sleeping, 2 stopped, 0 zombie
      Cpu(s): 0.0% us, 0.3% sy, 0.0% ni, 99.7% id, 0.0% wa, 0.0% hi, 0.0% si
      Mem: 2075352k total, 892136k used, 1183216k free, 17444k buffers
      Swap: 2096440k total, 0k used, 2096440k free, 758504k cached

      PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
      324 root 15 0 0 0 0 S 0.3 0.0 0:03.09 kjournald
      1 root 16 0 1864 628 1660 S 0.0 0.0 0:00.91 init
      2 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
      3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
      4 root 5 -10 0 0 0 S 0.0 0.0 0:00.12 events/0
      5 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 khelper
      6 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
      44 root 5 -10 0 0 0 S 0.0 0.0 0:00.02 kblockd/0
      55 root 16 0 0 0 0 S 0.0 0.0 0:00.21 pdflush
      57 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0
      56 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
      193 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod
      211 root 10 -10 0 0 0 S 0.0 0.0 0:00.00 xfslogd/0
      212 root 10 -10 0 0 0 S 0.0 0.0 0:00.00 xfsdatad/0
      213 root 15 0 0 0 0 S 0.0 0.0 0:00.00 xfsbufd
      219 root 9 -10 0 0 0 S 0.0 0.0 0:00.00 ata/0
      220 root 25 0 0 0 0 S 0.0 0.0 0:00.00 scsi_eh_0

      Kommentar


      • #4
        zeig mal den dump der tabellenstruktur und erkläre, was mit der tabelle gemacht wird.
        musst schon selbst mit messungen herausfinden, welche anforderung die datenbank belastet.

        Kommentar


        • #5
          Das Ding hat 2 GB Ram und gerade mal ein GB an Ram wird verbraucht, auch wenn das ein solo-mysql-Server ist?
          Das Programm mysqlreport gibt Auskunft darüber zu wie viel der Key-Cache genutzt ist, wenn das bei 100% liegt freut sich key_buffer_size über größere Werte~

          Ansonsten ist EXPLAIN immer eine gute Hilfe (zumindest für uns xP)

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            ok danke, werd ich gleich mal machen und dann hier posten.

            Kommentar


            • #7
              hab das probiert in putty:

              /usr/bin/perl mysqlreport --user meinusername --password meinpasswort --host localhost --all

              und bekomme die fehlermeldung
              Can't locate DBI.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at mysqlreport line 24.
              BEGIN failed--compilation aborted at mysqlreport line 24.


              Hab ich irgendwas an der Abfrage falsch gemacht? Wie soll ich die Abfrage durchführen?

              Kommentar


              • #8
                Ich würde sagen deine Perl-Installation ist unkomplett/fehlerhaft ... aber ich kann kein Perl, Google nach der Fehlermeldung, oder nutze den Hinweis hier: http://hackmysql.com/mysqlreportdoc "If mysqlreport breaks, send me a message with the error."

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X