Niko: Suchfunktion für Datenbank basierte Webseite

Hallo zusammen,

Ich bin dabei eine Webseite zu schreiben, die eine Videodatenbank verwaltet. Also sowas ähnliches wie Youtube oder so, nur eben nicht so allgemein und es kann auch nicht jeder etwas hinzufügen sondern nur bestimmte Leute.

Die Datenbank läuft mit MySQL und es werden Dinge gespeichert wie "id", "Titel", "Beschreibung", "Länge", "Kategorie", "Tags", "Rating", "Views".

So, jetzt möchte ich gerne eine Suchfunktion für diese Seite hinzufügen. Er soll also in der Datenbank nach Suchbegriffen suchen. Das Problem was sich dabei stellt ist, dass ich mit sehr vielen Datensätzen rechne (100 000 ist durchaus wahrscheinlich) und evtl auch sehr vielen Zugriffen auf die Seite. Ich befürchte, dass eine einfache SELECT ... WHERE ... LIKE ... Anfrage nicht die gewünschte Geschwindigkeit bringt, bzw. sie könnte den Server zu sehr auslasten.

Nun bin ich kein Experte und deswegen frag ich einfach mal, ob dem denn wirklich so ist oder ob MySQL schnell genug auch für sehr viele Anfragen und sehr große Datenbanken ist. Wenn nein, dann würde ich mich über andere Vorschläge wie Suchindex oder sowas freuen und evtl auch eine Informationsquelle, wo ich weitere Informationen beziehen kann.

Vielen Danke schonmal für eure Hilfe!

Lg Niko

  1. echo $begrüßung;

    Nun bin ich kein Experte und deswegen frag ich einfach mal, ob dem denn wirklich so ist oder ob MySQL schnell genug auch für sehr viele Anfragen und sehr große Datenbanken ist.

    "Sehr viele (lesende) Anfragen" kann man auf mehrere Server verteilen. MySQL bietet eine relativ einfach aufzusetzende Replikation an.

    Wenn nein, dann würde ich mich über andere Vorschläge wie Suchindex oder sowas freuen und evtl auch eine Informationsquelle, wo ich weitere Informationen beziehen kann.

    Es gibt die Volltextsuche und einen entsprechenden Index dazu. Eine umfangreiche Informationsquelle wäre das MySQL-Handbuch.

    echo "$verabschiedung $name";

  2. Wenn du "Tags" und "Titel" verwendest willst du vermutlich die Beschreibung ohnehin ignorieren... oder auch nicht, ist für die Antwort nicht soo relevant.
    Lege einfach einen Suchindex an, das heißt wann immer ein Video eingestellt oder editiert wird legst du in einer weiteren Tabelle für jedes vorkommende Wort einen Datensatz an, welcher auf die ID des Videos zeigt.
    Also
    keyword_id | keyword | video_id
    Dann kann SQL nach einem genauen Wert suchen anstatt nach "LIKE" (Volltext), das sollte die Performance verbessern. Wie in der anderen Antwort erwähnt kann diese Aufgabe auch ein anderer Server übernehmen wenn du das möchtest.

    Vorsichtshalber solltest du alle Schlüssel-Worte (sowohl in der Suche als auch beim Anlegen)
    caseinsensitive machen (lowern)
    Sonderzeichen 'rauswerfen oder ersetzen (um Zeichensatz-Konflikte zu umschiffen)
    Whitespaces entfernen (trimmen)
    ggf. den erhaltenen Wert (also das bereinigte Wort) hashen (um immer gleich lange Suchwörter zu erhalten und die Tabellenspalte darauf optimieren zu können).

    Gruß

    --
    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
    1. echo $begrüßung;

      Lege einfach einen Suchindex an, das heißt wann immer ein Video eingestellt oder editiert wird legst du in einer weiteren Tabelle für jedes vorkommende Wort einen Datensatz an, welcher auf die ID des Videos zeigt.
      Dann kann SQL nach einem genauen Wert suchen anstatt nach "LIKE" (Volltext), das sollte die Performance verbessern.

      Du bist sicher, dass eine eigene Indextabelle und die dann notwendige Verknüpfung mit der eigentlichen Tabelle schneller ist, als MySQLs Volltextindex, der nur mit einer Tabelle zu hantieren braucht?

      echo "$verabschiedung $name";

      1. Du bist sicher, dass eine eigene Indextabelle und die dann notwendige Verknüpfung mit der eigentlichen Tabelle schneller ist, als MySQLs Volltextindex, der nur mit einer Tabelle zu hantieren braucht?

        Nö, sicher bin ich nicht, soll heißen, ich habe keine Tests zuhänden. Aber ich weiß, dass zum Beispiel die großen (d.h. verbreiteten) Foren-Softwares oder online Shops dies so handhaben, die werden sich doch bestimmt 'was dabei gedacht haben ;).
        Und ja ich _glaube_ (ich weiß es aber ausdrücklich nicht), dass ein Query nach einem bestimmten Wert in der Wort-Index-Tabelle schneller ist als eine Volltextsuche auf der anderen Tabelle. Zumal eigentlich nur die IDs gebraucht werden... eigentlich, denn man will dem Benutzer ja noch die Titel-Auswahl geben, also wird man das Ergebnis in die eigentliche Tabelle linken müssen oder aber man macht einen Extra-Query. Ich denke dennoch dass es schneller bzw. weniger belastend ist.

        --
        sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
        1. echo $begrüßung;

          Aber ich weiß, dass zum Beispiel die großen (d.h. verbreiteten) Foren-Softwares oder online Shops dies so handhaben, die werden sich doch bestimmt 'was dabei gedacht haben ;).

          Wer weiß. Vielleicht steht denen kein Volltext-Index zur Verfügung.

          Und ja ich _glaube_ (ich weiß es aber ausdrücklich nicht), dass ein Query nach einem bestimmten Wert in der Wort-Index-Tabelle schneller ist als eine Volltextsuche auf der anderen Tabelle.

          Unter MySQL kann man einen Volltext-Index anlegen. Der wird letztlich nichts anderes sein als eine sortierte Wortliste. Da er aber direkt zur eigentlichen Tabelle gehört, ist man mit einer Suche fertig. Bei deinem Vorschlag muss man noch zu den gefunden ID die dazugehörenden Datensätze in einer zweiten Tabelle suchen.

          echo "$verabschiedung $name";