simone: Duplicate entry Mysql

HI,

Hab ein kleines Problem mit 'Duplicate entry'
ich möchte "sinnig" alle doppelten Inhalte aus der Spalte "titel" entfernen.

Problem  das die Db eine Größe von 97,2 MB hat.

Ich dachte daran mit:

DELETE DISTINCTROW T1.*, T1.id
FROM   buch_titel AS T1
       INNER JOIN buch_titel AS T2
       ON  T1.titel  = T2.titel
       AND T1.titel = T2.titel
WHERE  T1.id>T2.id;

die Einträge zu entfernen. Was bei dieser Größe nicht "sinnig" ist.

Dennoch sollte es ein einfache Möglichkeit geben. (per ALTER oder so..)

Bitte um Hilfe

Danke Simone

DB Struktur:

Feld Typ Attribute Null Standard Extra
id   int(9)   Nein    auto_increment
titel   longtext   Nein
keyword   varchar(255)   Nein

Indizes : Name Typ Kardinalität Feld
PRIMARY  PRIMARY  600660  id
keyword  UNIQUE  600660  keyword
titel  INDEX  keine  titel

Speicherplatzverbrauch : Typ Verbrauch
Daten 43.906 KB
Index 55.646 KB
Insgesamt 99.552 KB
    Zeilenstatistik : Angaben Wert
Format dynamisch
Zeilen 600.660
Zeilenlänge ø 74
Zeilengröße ø 170 Bytes
Nächste Autoindex 600.704

  1. Hallo,

    ich möchte "sinnig" alle ...

    Was bedeutet denn bitte "sinnig" in Bezug auf die Aufgabe?
    Zum Bleistift genau einen übrig zu lassen und Duplikate zu löschen?

    Willst du das regelmäßig machen oder ist das quasi "einmalige" Aufräumarbeit?

    Problem  das die Db eine Größe von 97,2 MB hat.

    Was ist daran bitte das Problem? In meiner Firma haben wir Datenbanken von 20GB Größe und arbeiten performant damit? Ist es evt. daran, dass du nur 100 MB beim Provider hast?

    DELETE DISTINCTROW T1.*, T1.id
    FROM   buch_titel AS T1
           INNER JOIN buch_titel AS T2
           ON  T1.titel  = T2.titel
           AND T1.titel = T2.titel
    WHERE  T1.id>T2.id;

    Was tut es, löscht es zuviel, zu wenig, die falschen .... ?

    Was bei dieser Größe nicht "sinnig" ist.

    Was hat das "sinnig" denn mit der Größe zu tun?

    Speicherplatzverbrauch : Typ Verbrauch
    Daten 43.906 KB
    Index 55.646 KB

    Du verbrauchst mehr Platz für die Indizes als für die reinen Nutzdaten? Ist das bei MySQL üblich oder ein Fehler in deiner DB, oder hast du eine reelle Anwendung dafür? Jedenfalls scheint mir das auf den ersten Blick nicht geheuer.

    Ciao, Frank

    1. Hallo,

      ich möchte "sinnig" alle ...

      Was bedeutet denn bitte "sinnig" in Bezug auf die Aufgabe?
      Zum Bleistift genau einen übrig zu lassen und Duplikate zu löschen?

      Willst du das regelmäßig machen oder ist das quasi "einmalige" Aufräumarbeit?

      Diese Fragen stellten sich auch mir, aber klärten sich fast wie von selbst... durch... na, weisst schon wie.

      Problem  das die Db eine Größe von 97,2 MB hat.

      Was ist daran bitte das Problem? In meiner Firma haben wir Datenbanken von 20GB Größe und arbeiten performant damit? Ist es evt. daran, dass du nur 100 MB beim Provider hast?

      Geil. Dicke Hose, eh? :))) Deine Firma?

      DELETE DISTINCTROW T1.*, T1.id
      FROM   buch_titel AS T1
             INNER JOIN buch_titel AS T2
             ON  T1.titel  = T2.titel
             AND T1.titel = T2.titel
      WHERE  T1.id>T2.id;

      Was tut es, löscht es zuviel, zu wenig, die falschen .... ?

      Der Index damei der Temoprär im RAM angelegt wird explodiert, wenn der SQLServer mit zu geringem KeySpeicher läuft. Ist zb ein Problem bei standardinstallationen von XAMP servern. Aber klar, wirst du nicht kennen, bei richtigen Firmen läuft das ja anders :))

      Was bei dieser Größe nicht "sinnig" ist.

      Was hat das "sinnig" denn mit der Größe zu tun?

      Siehe oben.

      Speicherplatzverbrauch : Typ Verbrauch
      Daten 43.906 KB
      Index 55.646 KB

      Du verbrauchst mehr Platz für die Indizes als für die reinen Nutzdaten? Ist das bei MySQL üblich oder ein Fehler in deiner DB, oder hast du eine reelle Anwendung dafür? Jedenfalls scheint mir das auf den ersten Blick nicht geheuer.

      Das kann zb an nicht optimireten indexes liegen, die mysql nicht selbständig optimiert.

      1. Hallo,

        ... durch... na, weisst schon wie.
        Geil. Dicke Hose, eh? :))) Deine Firma?
        bei richtigen Firmen läuft das ja anders :))

        Was bist du denn für ein, mit Verlaub, sau-dummer Pedant?

        Und nebenbei, was wolltest du eigentlich zum Ausdruck bringen?

        Und tschüss,
        Frank

        1. Hallo Frank,

          Was bist du denn für ein, mit Verlaub, sau-dummer Pedant?

          Wenn du wüsstest wie dumm... Aber pedantisch? Ne, nur bei "dicke hose fürs ego" machern. Aber okay, ich weiss dass es Menschen gibt, die das brauchen. Ein guter Freund von mir ist da genauso... ist trotzdem ein guter Freund von mir; wir versuchen halt, uns zu lieben. Keine einfache Sache das.

          Und nebenbei, was wolltest du eigentlich zum Ausdruck bringen?

          Na Mensch, ich wollte zeigen wie schlau du bist.

          Und nebenbei wollte ich noch aufzeigen dass eine 92 mb grosse tabelle durchaus ein problem sein kann.  Hast du das etwa überlesen?

          Wirklich, nix für ungut, schamtz und tschüss,
          Piere.

    2. Hallo,Frank

      ....In meiner Firma haben wir Datenbanken von 20GB Größe ....

      Hut ab, und das mit mysql und dann noch performant....

      .....Du verbrauchst mehr Platz für die Indizes als für die reinen Nutzdaten? Ist das bei MySQL üblich oder ein Fehler in deiner DB, oder hast du eine reelle Anwendung dafür? Jedenfalls scheint mir das auf den ersten Blick nicht geheuer..........

      Volltext Suche

      Simone

      1. Hallo Simone,

        leider hast du keine meiner wichtigeren Fragen beantwortet.

        Hast du dein Problem mittlerweile gelöst?

        Ciao, Frank

        1. Hallo Frank,

          ich machs auch so wehnig sarkastisch wies nur geht, versprochen.

          leider hast du keine meiner wichtigeren Fragen beantwortet.

          In dem Posting von Simone, das mir vorliegt, hat sie allerdings eine deiner Fragen beantwortet, und zwar die frage nach dem doch recht grossen Speicherverbrauch des Indexes. Und sie antwotete dir wie folgt:

          Volltext Suche

          Was sicher meint, dass auf dem Feld 'titel' ein volltextindex liegt. Und das macht dann den index sehr gross, das weiss ich aus eigener Erfahrung.

          Apropos: Da du ja offensichtlich noch nicht viel mit MySQL zu machen hattest, möchte ich anmerken, dass falls du Fragen haben solltest du dich nicht scheuen brauchts diese auch zu stellen; Ich denke ich kann für alle sprechen wenn ich schreibe: Wir helfen gern. Und wenn dir einer zb zu pendantisch ist, dann versuchs zu ignorieren - jeder hat halt so seine Macken, die man handeln muss ;)

          Hast du dein Problem mittlerweile gelöst?

          Sieht ganz so aus, aber vllt schreibt Simone ja noch selbst was dazu.

          Gruss, Piere.

  2. HI,

    Gruss zurück.

    Hab ein kleines Problem mit 'Duplicate entry'
    ich möchte "sinnig" alle doppelten Inhalte aus der Spalte "titel" entfernen.

    Google sagt zwei Möglichkeiten:

    CREATE TABLE neuetabelle (titel VARCHAR(255) not null) SELECT DISTINC titel FROM buch_titel;

    Legt eine neue Tabelle an und schreibt the titel da rein.

    ALTER IGNORE TABLE buch_titel ADD UNIQUE INDEX(titel);

    Damit wird UNIQUE INDEX auf titel angelegt, wobei durch IGNORE alle doppelten Einträge bis auf einen (den letzten?) gelöscht werden, damit der index auch wirklich UNIQUE ist. Wobei es dann bei der Struktur der Tabelle ein Problem gibt:

    titel   longtext   Nein

    da AFAIK 'longtext' nicht UNIQUE INDEX sein kann. Dann also vorher noch den typ von titel ändern, und zwar so:

    ALTER CHANGE TABLE buch_titel titel titel CHAR(255) NOT NULL;
      ALTER IGNORE TABLE buch_titel ADD UNIQUE INDEX(titel);

    Ich nehme dabei an, dass 255 eine ausreichende Länge für einen Buchtitel ist ;) Auch nehme ich an, dass alle whitespace chars aus den Titeln raus sind... Alle Titel die Länger als 255 Zeichen sind, werden auf 255 Zeichen gekürzt.

    Problem  das die Db eine Größe von 97,2 MB hat.

    Don't try this at home!

    :)

    1. @all

      Bin jetzt erst vom Feiern Daheim.
      Danke Euch

      Ich werde mir das erstmal Morgen, ähhhh heute, ansehen.

      guten Nacht
      und danke Simone

    2. HI Piere,

      ALTER CHANGE TABLE buch_titel titel titel CHAR(255) NOT NULL;
        ALTER IGNORE TABLE buch_titel ADD UNIQUE INDEX(titel);

      So sollte es gehen.

      Dank Dir!!!!!!!!!!!!!!!!!!!
      und ein schönes Wochenende

      Simone