Benutzersuche(dynamisch)

#1
Hallo, ich möchte auf meiner Seite eine dynamische Benutzersuche einbinden.

Beispiel:
- Datenbank:
- Hans
- Harald
- Peter
- Benutzer gibt ins Suchfeld folgendes ein: 'h'
- Hans und Harald werden vorgeschlagen, da beide mit 'h' beginnen bzw. ein 'h' beinhalten.
- Benutzer gibt ins Suchfeld folgendes ein: 'har'
- Nur noch Harald wird angezeigt.

Achja, unsere Datenbank besteht aus 2000 Nutzern. Darin soll gesucht werden.
Was ist nun die beste Methode, dies umzusetzen?

Meine Ideen:
- Ein SQL Befehl zum Selecten aller Nutzer, dann in ein Array stecken. Und dann wird das Array durchsucht.
- Bei jeder Eingabe wird gesucht.

Würde dabei auch gern so sparsam wie möglich arbeiten(So schnell wie möglich).

Wäre super wenn Jemand da eine Idee hat :p
MfG CubE135
 

DJFelipe

Well-Known Member
c-b Experte
#2
Was spricht gegen LIKE?

SQL:
SELECT vorname FROM meiner_tabelle WHERE vorname LIKE '%h%'
 

Mat

Well-Known Member
c-b Experte
#3
Abhängig davon, welche Sprache du im Backend verwendest, könnte es bereits gute Unterstützung für Lazy Loading oder deine Idee mit dem Zwischenspeichern der Ergebnisse geben. Vielleicht noch was mit einem Cache.

Die Benutzerdaten ändern sich ja nur, wenn ein User sich registriert, seinen Account löscht oder seinen Usernamen ändert. Es gibt theoretisch keinen Grund, das in anderen Fällen abzufragen. Ich weiß allerdings nicht, ob es sich bei 2000 Datensätzen leistungstechnisch schon lohnt, eine Cache-Lösung zu überlegen. Vielleicht bringt es auch was, bei MySQL, regelmäßig mehrere Views (pro Anfangsbuchstaben oder sowas) zu erzeugen und diese jeweils nach Usernamen aufsteigend zu indizieren. Die Schnittstelle könnte dann den passenden, kleineren View abfragen, statt 2000 Datensätze durchsuchen zu müssen. Ist aber nur so eine Idee, ich kann nicht abschätzen wie groß der Performancegewinn wäre, wenn überhaupt.

Edit:
PS, wie läuft das eigentlich hier im Forum mit der Usersuche? Also wenn man zum Beispiel @ eingibt und dann anfängt zu tippen. Hier gibts ja mehr als 2000 User.
 
#4
@DJFelipe Wie der SQL Befehl funktioniert ist klar. Will ich aber bei jeder Benutzereingabe einen SQL befehl ausführen der durch alle 2000+ einträge sucht? Das ist wahrscheinlich nicht sehr effektiv. Ergebnis wird so zwar erzielt, aber eher langsam.

@JeanClaudeVanDamn Im backend verwende ich PHP/Javascript.
Was ist unter Lazy Loading zu verstehen?
Ich denke einmal alle Benutzernamen beim ersten Laden der Seite zu selecten, sollte relativ schnell gehen.
Was meinst du mit Views bei MySQL?(bin Anfänger :x)
Würde auch gern wissen wie das hier im Forum läuft :p Das weiß aber wohl kaum einer, denke ich :D

Also wäre die beste Möglichkeit, erstmal ein Array aus allen Namen zu erzeugen, und dann das Array zu durchsuchen? So begrenze ich das Ganze auf nur eine SQL Abfrage. Der Rest wird durchs Array geregelt. Oder noch jemand eine bessere Idee? :D
 

lano

Well-Known Member
c-b Experte
#5
PS, wie läuft das eigentlich hier im Forum mit der Usersuche?
Du beginnst mit dem @ gefolgt von 3 weiteren Zeichen.
Das löst die Abfrage aus und es wird ein POST an /index.php?members/find&_xfResponseType=json abgesetzt.
Wie dem Request schon zu entnehmen ist bekommt man ein json zurück mit allen Usernamen und Avatar gedöns.
Daraufhin öffnet sich die tolle Liste und man kann einen User auswählen.
Gibst du Weitere Zeichen ein wird für jedes weitere Zeichen eine erneute Anfrage gesendet die die Auswahl eingrenzt.
 
Gefällt mir: Mat

Mat

Well-Known Member
c-b Experte
#6
Du beginnst mit dem @ gefolgt von 3 weiteren Zeichen...
Ich meinte eigentlich die Bearbeitung der Anfrage im Backend (also ob der jedes mal alles lädt oder es gepuffert zieht und ausgibt). Aber das ist auch interessant, musste ich direkt selbst ausprobieren. :D

150208-Postman.png

Was ist unter Lazy Loading zu verstehen? [...] Was meinst du mit Views bei MySQL?(bin Anfänger :x)
LazyLoading
Lazy Loading ist zum Beispiel, wenn man einen Datenstream empfängt und diesen beendet, sobald das Ergebnis gefunden wurde. Weil es ein gestückelter Stream ist, kann man auch schon mit den Zwischenergebnissen arbeiten und darauf reagieren oder den sogar parallelisieren.

Im Gegensatz dazu gibts bei Eager Loading erstmal alles am Stück. Das hat sicher Vorteile, weil du dann nicht so viele kleine Pakete hast, sondern nur ein paar größere. Das Problem ist dann glaube ich aber, dass das an einem Stück in den Speicher muss, bevor man damit weiterarbeitet.

Unter Lazy Loading könnte man aber auch das Laden von Ergebnissen per Ajax verstehen, bei dem zum Beispiel nur die ersten 20 Ergebnisse geladen werden, und man auf weiter klicken kann, um mehr einzublenden. Oder zum Beispiel dass bestimmte Bilder erst geladen werden, wenn der User auch da hingescrollt hat.

Views
Ein View ist wie eine dynamisch generierte Tabelle, die sich ihren Inhalt aus anderen Tabellen zieht. Wenn du die User häufig abfragst und die von dir benötigten Daten nur bestimmte Spalten enthalten und vielleicht auch noch aus verschiedenen Tabellen kommen, könntest du die in einen View packen. Wird wie eine Tabelle erstellt und auch wie eine Tabelle abgefragt. In erster Linie ist das nur eine Vereinfachung von Abfragen, weil die für den View benötigten Abfragen trotzdem durchgeführt werden müssen (ist ja dynamisch). Aber wenn es die Einstellungen hergeben, könnte der Kram auch gecached werden.. dann kann man den View so abfragen, als wäre er eine einzige Tabelle ohne Verknüpfungen. Würde vielleicht was bringen, wenn du normalerweise viele JOINs hättest oder wenn du verschiedene Views für verschiedene Anfangsbuchstaben erstellen könntest. Aber ich glaube nicht, dass sich das bei 2000 Usern lohnt. Und es müsste auch wirklich cachen, sonst bringt das nicht viel.

Sonstiges
Ich denke zwischen PHP und MySQL (mit PDO oder mysqli) hast du in der Regel sowieso gestückelte Streams, außer du gibst was anderes an. Und ich würde davon ausgehen, dass die Abfragen schon alle gut optimiert sind. Da braucht man in der Regel nicht ansetzen.

Ich hatte mal gelesen, dass PHP Sessions auf der Festplatte speichert und man das auch gerne auf memcached oder redis auslagert. Das wäre vielleicht eine Idee, falls du die 2000 User immer in $_SESSION['usertabelle'] oder sowas reinladen willst.
 
#7
Hey, danke für die ausführliche Erklärung :)
Habe es nun ganz einfach mit einem Array gelöst. Die eine SQL Anfrage am Anfang braucht kaum Zeit.
Rest dann natürlich mit JQuery :)
 
Oben