Zunächst einmal alles, was ich weiß:
Vorzeitige Optimierung ist die Wurzel allen Übels
Aber ich denke, dass falsche Autovervollständigung Ihre Website wirklich sprengen kann.
Ich würde wissen, ob es irgendwelche Bibliotheken gibt, die eine automatische Vervollständigung (serverseitig) durchführen können, die vorzugsweise in den RAM passen (für die beste Leistung). Also keine browserseitige Javascript-Vervollständigung (yui / jquery / dojo). Ich denke, es gibt genügend Thema auf Stackoverflow. Aber ich konnte im Stackoverflow keinen guten Thread darüber finden (vielleicht sah ich nicht gut genug aus).
Zum Beispiel Namen automatisch vervollständigen:
%Vor%Woran ich denken kann:
SELECT name FROM users WHERE name LIKE al%
.
http://localhost:8983/solr/terms?terms.fl=name&terms.sort=index&terms.prefix=al&wt=json&omitHeader=true
.
Was ich gerne hören würde, ist die Implementierung, die von Seiten verwendet wird, und die Anzahl, wie gut sie mit load umgehen kann, vorzuziehen mit:
Vielen Dank,
Alfred
Leider hängt die Lösung dieses Problems stark von den Daten ab, die Sie abfragen möchten.
LIKE-Abfragen werden Ihre Datenbank nicht zu sehr belasten, solange Sie Zeit mit 'EXPLAIN' oder dem Profiler verbringen, um Ihnen zu zeigen, wie der Abfrageoptimierer Ihre Abfrage durchführen möchte.
Einige Dinge, die Sie beachten sollten:
Indizes: Stellen Sie sicher, dass Sie Indizes eingerichtet haben. (Ja, in vielen Fällen verwendet LIKE die Indizes. Es gibt einen ausgezeichneten Artikel zum Thema bei myitforum. SQL-Leistung - Indizes und die LIKE-Klausel ).
Joins: Stellen Sie sicher, dass Ihre JOINs vorhanden sind und vom Abfrageplaner optimiert werden. SQL Server Profiler kann dabei helfen. Suchen Sie nach vollständigen Index- oder vollständigen Tabellenscans
Auto-Complete-Abfragen sind ein Sonderfall, da sie normalerweise immer weniger Subsets verwenden.
'name' LIKE 'a%'
(kann 10000 Datensätze zurückgeben) 'name' LIKE 'al%
'(kann 500 Datensätze zurückgeben) 'name' LIKE 'ala%'
(kann 75 Datensätze zurückgeben) 'name' LIKE 'alan%'
(kann 20 Datensätze zurückgeben) Wenn Sie die gesamte Ergebnismenge für Abfrage 1 zurückgeben, müssen Sie die Datenbank nicht erneut für die folgenden Ergebnismengen treffen, da es sich um eine Untergruppe Ihrer ursprünglichen Abfrage handelt.
Abhängig von Ihren Daten kann dies eine weitere Möglichkeit zur Optimierung eröffnen.
Ich werde Ihren Anforderungen nicht nachkommen und die Größenordnungen hängen natürlich von der Hardware, der Größe der Datenbank, der Architektur der App und einigen anderen Dingen ab. Sie müssen es selbst testen.
Aber ich werde Ihnen die Methode, die ich mit Erfolg verwendet habe, sagen:
SELECT name FROM users WHERE name LIKE al%.
, aber verwenden Sie TOP 100
, um die Anzahl der Ergebnisse zu begrenzen. Ich hoffe, es hilft.
Die Verwendung von SQL im Vergleich zu Solrs Begriffen ist kein Vergleich. In ihrem Kern lösen sie das Problem auf die gleiche Weise, indem sie einen Index erstellen und dann einfache Aufrufe dazu machen.
Was ich wissen möchte, ist "was Sie versuchen, automatisch zu vervollständigen".
Letztlich ist der einfachste und sicherste Weg, ein System zu skalieren, eine einfache Lösung zu erstellen und das System dann einfach zu skalieren, indem Daten repliziert werden. Der Versuch, Aufrufe zu cachen oder Ergebnisse vorherzusagen, macht die Dinge nur kompliziert und bringt Sie nicht zum Ursprung des Problems (dh Sie können sie nur so weit nehmen, als ob jede Anfrage den Cache verpasst hätte).
Vielleicht wäre ein wenig mehr hilfreich, wie Ihre Daten strukturiert sind und wie Sie sie extrahieren möchten.
Tags und Links memory performance autocomplete