Andreas Lindig: &PHP - lieber 2000 DB-Anfragen oder komplizierte Vergleiche?

Hallo Forum,

ich habe einen aufgeteilten Index. In einer Tabelle stehen die Wörter (unique) mit je einer ID und in der zweiten stehen die Verknüpfungen der WortID zu irgendwelchen Fundstellen.

Wenn ich jetzt einen Stapel neue Wörter indizieren will, muß ich ja nachsehen, welche davon es schon gibt. Die neuen Wörter trage ich dann ein und lass mir die neue ID zurückgeben, von den bereits vorhandenen lese ich die ID zur Weiterbearbeitung aus. Ich brauche also zu allen Wörtern des Textes am Ende eine ID.

Wenn ich aber z.B. 2000 verschiedene Wörter aus einem Text indizieren will, muß ich 2000 Anfragen an die DB stellen:

SELECT ID
FROM worttabelle
WHERE wort = $wort

und bekomme dann eine ID zurück oder trage im negativen Fall das Wort ein...
Oder ich frage _einmal_ mit

SELECT wort, ID
FROM worttabelle
WHERE $wort in('wort1', 'wort2', 'wort3'...)

und bekomme die Liste der schon vorhandenen Wörter mitsamt ID. Dann müßte ich nur noch die neuen Wörter eintragen.

Aber dazu muß ich in PHP die beiden Wortlisten vergleichen. Die DB-Anfrage ist nicht case-senitiv und in PHP kann ich - soweit mir bekannt - direkte Array-Vergleiche auf gemeinsame Elemente nur case-senitiv machen. Für einen case-insentiven Vergleich müßte ich also _jedes_ Element aus _beiden_ Arrays z.B. mit strtolower behandeln und dann vergleichen.

Was ist besser?

Gruß, Andreas

--
SELFFORUM - hier werden Sie geholfen,
auch in Fragen zu richtiges Deutsch
  1. echo $begrüßung;

    Was ist besser?

    Vielleicht ein etwas anderer Ansatz?

    Du könntest, wenn es sich bei der DB um MySQL handelt, alle Wörter des neuen Textes mit
      INSERT IGNORE worttabelle (wort) VALUES (...),(...), ...
    hinzufügen. Die bereits vorhandenen werden dabei übergangen. Damit kannst du mit einem Aufruf alle neuen Wörter hinzufügen.

    Dann noch ein
      SELECT wort, id ... WHERE wort in (...)
    und du hast mit einem zweiten Aufruf alle IDs der Wörter.

    echo "$verabschiedung $name";

    1. Vielleicht ein etwas anderer Ansatz?

      vielleicht...;-)

      wenn es sich bei der DB um MySQL handelt

      jo,

      INSERT IGNORE worttabelle (wort) VALUES (...),(...), ...

      ACH!... IGNORE kannte ich gar nicht. Damit wäre eigentlich schon das Wesentliche gelöst. Ich hatte mich auch gerade auf einen ziemlich komplizierten Weg gemacht, weil ich die Möglichkeit, mehrere Datensätze auf einen Schlag einzufügen ganz vergessen hatte. Jetzt müßte ich nur noch wissen, ob der Index der Tabelle dann erst _nach_ dem gesamten INSERT erneuert wird. Ich hatte nämlich vorher das Problem, daß nach jedem INSERT der Index erneuert wird und das wird bei großen Tabellen langsam gegen 0. Also habe ich vor dem INSERT den Index gelöscht, alles eingefügt und den Index wieder gesetzt. Aber das ist wohl auch nicht im Sinne des Verstorbenen ;-) Und ohne Index geht eben auch IGNORE nicht. Also meinst Du das Einfügen ist performancemäßig o.k.?

      Gruß, Andreas

      --
      SELFFORUM - hier werden Sie geholfen,
      auch in Fragen zu richtiges Deutsch
      1. echo $begrüßung;

        Also meinst Du das Einfügen ist performancemäßig o.k.?

        Das weiß ich nicht genau. Ist das denn überhaupt in deinem Anwendungsfall so dramatisch wichtig? Wie oft werden denn Texte neu hinzugefügt?

        Ich habe eine Suche, die genauso funktioniert, die beinhaltet mittlerweile ca 54.000 Wörter. Das Hinzufügen von 40-50 KB Text jeden Monat ist im Handumdrehen erledigt.

        echo "$verabschiedung $name";

        1. Hallo,

          echo $begrüßung;

          Also meinst Du das Einfügen ist performancemäßig o.k.?

          Das weiß ich nicht genau. Ist das denn überhaupt in deinem Anwendungsfall so dramatisch wichtig? Wie oft werden denn Texte neu hinzugefügt?

          oft. Es ist ein Forum. Und ich baue es gerade so um, daß man mehrere Instanzen einrichten kann und alle benutzen den gleichen Suchindex, damit unnötige Worttabellen gespart werden.

          Ich habe eine Suche, die genauso funktioniert, die beinhaltet mittlerweile ca 54.000 Wörter.

          das ist aber noch wenig. Ich habe mich _hier_ mal erkundigt: es gibt ca. 1.3 Mio verschiedene Wörter im Selfraum. Und das sind nur die ganzen Wörter - die in Teilwörter zerpflückt ergibt ca. 8.2 Mio.

          Gruß, Andreas

          --
          SELFFORUM - hier werden Sie geholfen,
          auch in Fragen zu richtiges Deutsch
          1. echo $begrüßung;

            Ich habe eine Suche, die genauso funktioniert, die beinhaltet mittlerweile ca 54.000 Wörter.

            das ist aber noch wenig.

            Bei mir handelt es sich um redaktionelle Beiträge von 5 Jahren eines 32-Seiten-Magazins. Da ist nicht so viel Spreu z.B. durch verhunzte Wortkreationen wie in einem öffentlichen Forum dabei... :-)

            echo "$verabschiedung $name";