So implementieren Sie eine schnellere Suche während der Eingabe (SAYT) api in Rails 3-Anwendung

9

Ich habe Millionen von Datensätzen in meiner MySQL-Datenbank. Ich habe eine normale REST-API für die iPhone-App in Rails 3 implementiert, aber die Antwort des SAYT-Features ist sehr langsam. Es braucht viel Zeit, um die Datenbank zu durchsuchen und die Ergebnisse zurückzugeben. Wie kann ich die Leistung verbessern?

Ich habe meine Tabellen indexiert. Auf welche Aspekte sollte ich mehr eingehen als MySQL Tuning, oder sollte ich Rails Sphinx oder Sunspot verwenden? Wird das helfen? Bitte helfen Sie mir mit all Ihren Ratschlägen.

    
Amal Kumar S 24.02.2012, 06:12
quelle

6 Antworten

2

Ich stimme der allgemeinen Antwort zu: Verwenden Sie eine Suchmaschine wie Sphinx (und begrenzen Sie die Anzahl der zurückgegebenen Ergebnisse); Sie sind so konzipiert, genau das zu tun, was Sie wollen.

Aber während Millionen von Datensätzen viel klingen mögen, sollten Sie zuerst feststellen, was lange dauert. Ich habe große Liebe zu Sphinx und ThinkingSphinx - sie nehmen, was ein ziemlich komplexer Prozess ist, und machen es ziemlich einfach und einfach. Aber am Ende, eine Suchmaschine, ist es ein anderes System zu verwalten, zu konfigurieren, zu lernen und zu wissen. Wenn Sie nicht dorthin gehen müssen, ist es einfacher, nicht wahr?

Es könnte die Abfrage sein, es könnte Zeit für die Rückgabe der Daten sein ( limit ist dein Freund!). Oder es kann sein, dass Sie Hunderte von Anfragen pro Sekunde erhalten, vielleicht weil die Verzögerung bei der automatischen Vervollständigung zu kurz ist - wenn bei jedem Zeichen nachgeschlagen wird, können schnelle Schreibkräfte oder mehrere Benutzer leicht Überlaufe den Server mit Abfragen, die kein Dienstprogramm für den Benutzer bereitstellen.

Beobachten Sie die Rails-Protokolle und sehen Sie, was wirklich vor sich geht. Wenn es ein einfaches Abfrageleistungsproblem ist, eine komplizierte Volltextsuche durchführend, dann wird das langsam und Sphinx wird die Mühe wert sein. Ihre Datenbank verfügt über ein Tool explain , das Ihnen bei einigen Arbeiten hilft, zu verstehen, was die Datenbank tut, um das Ergebnis zu erzielen. Es ist nicht ungewöhnlich, dass ein Index nicht verwendet wird.

Was ist mit Caching? Memcached ist ein fantastisches Werkzeug. Oder vielleicht können sogar nur Ihre Puffergrößeneinstellungen für die Datenbank ermöglichen, dass mehr Speicher für das Caching verwendet wird.

    
Tom Harrison Jr 14.03.2012 19:28
quelle
1

Ich bin mir nicht sicher, was Sie meinen, indem Sie eine schnellere Suche hinzufügen, aber es ist gut, Ihre Suchergebnisse auf 100 zu beschränken, da es die Benutzerfreundlichkeit berührt. Nicht viele Benutzer werden 100 Datensätze für ihre Suche durchlaufen.

Um eine solche Suche zu erreichen, schlage ich vor, dass Sie die Keyword-Tabelle hinzufügen. Die Keyword-Tabelle sollte aus der Datensatz-ID und dem damit verknüpften Keyword bestehen und wie oft das Keyword in der Datenbank ausgeführt wurde.

Damit wird es Ihnen helfen, die oberen hundert Datensätze und die genaueste Suche zu bestimmen.

Es gibt viele Algorithmen, die auch als Map Reduce suchen, die gleichzeitig laufen. Ich denke nicht, dass Ihre Mobilgerätetechnologie mit der Kartenreduzierung umgehen kann.

    
madi 25.02.2012 18:24
quelle
1

Ich würde auch empfehlen, eine Volltext-Suchmaschine wie Sphinx zu verwenden.

Es gibt einen guten Screencast zur Verwendung von Sphinx und Rails mit dem Juwel thinking_sphinx:

Railscast thinking_sphinx Juwel

Mit diesem Juwel können Sie auch das Suchergebnis in Bezug auf Wichtigkeit beeinflussen, z. Feldgewichte hinzufügen:

Thinking Sphinx-Dokumentation

Da es ein mobiles Gerät ist, würde ich die Menge der Ergebnisse, die an das Handy gesendet werden, auf ein Minimum beschränken, wie Madi es bereits erwähnt hat.

Viel Spaß

    
holger81 01.03.2012 17:12
quelle
1

Um Millionen von Datensätzen schnell zu durchsuchen, werden Sie wahrscheinlich eine Datenstruktur vom Trie-Typ verwenden wollen. Ссылка hat Ruby-Beispielcode, wenn Sie Hilfe benötigen.

Vereinfacht gesagt, ist der Trie eine äußerst speichereffiziente Methode, um zu verfolgen, welche Kinder zur ursprünglichen Liste von Zeichen gehören.

Im Wesentlichen würde Ihre SAYT-Technologie eine Zeichenfolge aufnehmen und die obersten 15 Ergebnisse aus dem Eintrag des Trie für diese Zeichenfolge zurückgeben.

Je nachdem, wie selbstähnlich Ihre Zeilen sind, hat das natürlich Auswirkungen auf Ihre RAM-Nutzung.

    
Peter V 13.03.2012 17:50
quelle
0

Je nachdem, welche Abfrage Sie durchführen, können LIKE -Abfragen, die am Anfang der Spalte übereinstimmen, Indizes verwenden (in Postgres weiß ich genau, dass sie das tun; in MySQL bin ich mir nicht sicher).

Also,

%Vor%

verwendet einen Datenbankindex (zumindest in Postgres), während

%Vor%

wird nicht. Notieren Sie % am Anfang des Suchbegriffs. Ihr Kilometerstand kann auch mit ILIKE (Groß- / Kleinschreibung beachten), vs LIKE (Groß- / Kleinschreibung) Bedingungen variieren. Lesen Sie die Datenbankdokumente. Das kann die niedrigste Frucht sein.

Eine Suchmaschine, wie von einer anderen Antwort vorgeschlagen, ist eine andere Option. Wenn Sie auf Heroku eingesetzt werden, gibt es einige Cloud-Such-Add-Ons, die ziemlich einfach zu integrieren sind, aber es ist wahrscheinlich immer noch eine Größenordnung mehr Arbeit als das Tunen Ihrer Abfragen ein wenig.

    
Wolfram Arnold 11.03.2012 05:15
quelle
0

Du könntest eine Tabelle für die meistgesuchten erstellen und dann die Suche nach dieser Möglichkeit priorisieren, hoffe, das hilft.

    
Jay Mee 14.03.2012 13:34
quelle