Was ist schneller / effizienter - viele kleine MySQL-Abfragen oder ein großes PHP-Array?

8

Ich habe eine PHP / MySQL-basierte Webanwendung, die mehrere Sprachen über eine MySQL-Tabelle "language_strings" mit den Feldern string_id, lang_id, lang_text unterstützt. Ich rufe dann die folgende Funktion auf, wenn ich eine Zeichenfolge in der ausgewählten Sprache anzeigen muss ...

%Vor%

Das funktioniert perfekt, aber ich bin besorgt, dass es viele Datenbankabfragen geben könnte. z.B. Das Hauptmenü hat 5 Linktexte, die alle diese Funktion aufrufen.

Wäre es schneller, die gesamten Ergebnisse der Sprachstrings für die ausgewählte lang_id in ein PHP-Array zu laden und dann von der Funktion aus aufzurufen? Möglicherweise wäre das ein riesiges Array mit einem großen Teil davon, aber es wäre eindeutig eine Datenbankabfrage pro Seitenladung anstelle von Lots.

Kann jemand einen anderen effizienteren Weg vorschlagen, dies zu tun?

    
Pandy Legend 21.08.2012, 08:54
quelle

6 Antworten

3

OK - Ich habe ein Benchmarking durchgeführt und war überrascht festzustellen, dass das Setzen von Dingen in ein Array statt auf einzelne Abfragen im Durchschnitt 10-15% SLOWER war.

Ich denke, der Grund dafür war, dass, selbst wenn ich die "ungewöhnlichen" Elemente herausfiltern würde, zwangsläufig immer unbenutzte Elemente selbstverständlich sein würden.

Mit den individuellen Fragen komme ich immer nur raus, was ich brauche und da die Fragen so einfach sind, denke ich, dass ich am besten bei dieser Methode bleibe.

Das funktioniert für mich, natürlich in anderen Situationen, in denen die einzelnen Abfragen komplexer sind. Ich denke, dass die Methode zum Speichern gemeinsamer Daten in einem Array effizienter wäre.

    
Pandy Legend 21.08.2012, 13:05
quelle
6

Es gibt keine Antwort, die nicht zwischen Groß- und Kleinschreibung unterscheidet. Sie können es wirklich von Fall zu Fall betrachten. Allerdings wird es in der Regel schneller sein, alle Daten in einer Abfrage abzurufen, sie in ein Array oder Objekt einzufügen und von dort auf sie zu verweisen.

Der Vorbehalt besteht darin, ob Sie alle Ihre Daten, die Sie in einer Abfrage benötigen, so schnell wie die fünf einzelnen Daten abrufen können. Das ist, wo die Leistung der Abfrage selbst ins Spiel kommt.

Manchmal ist eine Abfrage, die eine oder zwei Unterabfragen enthält, weniger zeiteffizient als das Ausführen einzelner Abfragen.

Mein Vorschlag ist, es zu testen. Holen Sie sich eine Abfrage, die alle benötigten Daten enthält, und sehen Sie, wie lange die Ausführung dauert. Zeit jede der anderen fünf Abfragen und sehen, wie lange sie kombiniert dauern. Wenn es fast identisch ist, kleben Sie die Ausgabe in ein Array und das wird effizienter sein, da Sie keine häufigen Verbindungen zur Datenbank selbst herstellen müssen.

Wenn Ihre kombinierte Abfrage jedoch länger dauert, um Daten zurückzugeben (z. B. könnte sie einen vollständigen Tabellenscan verursachen, anstatt Indizes zu verwenden), dann bleiben Sie bei einzelnen Abfragen.

Schließlich, wenn Sie die gleichen Daten immer und immer wieder verwenden werden, gewinnt ein Array oder Objekt jedes Mal , da der Zugriff viel schneller ist als es von einer Datenbank zu bekommen.

    
Fluffeh 21.08.2012 08:56
quelle
3

Stimmen Sie mit dem überein, was alle hier sagen. Es geht nur um die Zahlen.

Einige zusätzliche Tipps:

  1. Versuchen Sie, ein einzelnes Speicher-Array zu erstellen, das das von Ihnen benötigte Minimum enthält. Dies bedeutet, dass die meisten der offensichtlichen Redundanzen entfernt werden müssen.

  2. Es gibt Standardansätze für diese Probleme in leistungskritischen Umgebungen, wie die Verwendung von memcached mit mysql. Es ist ein bisschen übertrieben, aber das erlaubt Ihnen im Grunde, etwas externen Speicher zuzuweisen und Ihre Abfragen dort zwischenzuspeichern. Da Sie auswählen, wie viel Speicher Sie reservieren möchten, können Sie sie entsprechend der Speicherkapazität Ihres Systems planen.

  3. Spiel einfach mit den Zahlen. Versuchen Sie, separate Abfragen zu verwenden (was der einfachste Ansatz ist) und strapazieren Sie Ihr PHP-Skript (wie es Hunderte Male von der Kommandozeile aus aufruft). Messen Sie, wie viel Zeit das dauert und sehen Sie, wie groß der Leistungsverlust tatsächlich ist. Aus meiner persönlichen Erfahrung kommend, speichere ich normalerweise alles im Speicher, und eines Tages, wenn die Daten zu groß werden, fehlt mir der Speicher. Dann habe ich alles auf getrennte Abfragen aufgeteilt, um Speicher zu sparen und zu sehen, dass die Auswirkungen auf die Leistung gar nicht so schlecht waren:)

talkol 21.08.2012 09:06
quelle
1

Ich bin mit Flufeh dabei: Sehen Sie sich andere Möglichkeiten an (Joins, Unterabfragen, stellen Sie sicher, dass Ihre Indizes die Relativität der Daten widerspiegeln - aber nicht überindizieren und testen ) . Am wahrscheinlichsten wirst du irgendwann mit einem Array enden, also hier ist ein kleiner Performance-Tipp, im Gegensatz zu dem, was du erwartest, Zeug wie

%Vor%

ist auch weniger Speicher effizient im Vergleich:

%Vor%

Außerdem können Sie beim Abrufen der Daten nach redundanten Daten suchen.

    
Elias Van Ootegem 21.08.2012 09:19
quelle
1

Meine Antwort ist, etwas dazwischen zu tun. Abrufen aller Zeichenfolgen für eine lang_id, die kürzer als eine bestimmte Länge (z. B. 100 Zeichen) sind. Kürzere Textzeichenfolgen werden häufiger an mehreren Stellen als längere verwendet. Cache die Einträge in einem statischen assoziativen Array in get_lang_string (). Wenn ein Element nicht gefunden wird, rufen Sie es über eine Abfrage ab.

    
cleong 21.08.2012 09:50
quelle
0

Ich bin momentan an dem Punkt in meinem site/application , wo ich bremsen musste und sehr genau über die Geschwindigkeit nachdenken musste. Ich denke, diese genannten Geschwindigkeitstests sollten das Verkehrsaufkommen auf Ihrem Server als wichtige Variable berücksichtigen, die die Ergebnisse beeinflussen wird. Wenn Sie Daten in JavaScript-Datenstrukturen einfügen und sie auf dem Client-Rechner verarbeiten, sollte die Verarbeitungszeit regulärer sein. Wenn Sie viele Daten über mysql über php anfordern (zum Beispiel), wird die Nachfrage auf einen Rechner / Server verlagert und nicht verteilt. Wenn Ihr Datenverkehr zunimmt, müssen Sie die Serverressourcen für viele Benutzer freigeben, und ich denke, dass dies die Aufgabe ist, die Belastung des Servers durch JavaScript zu verringern. Sie können Daten auch über localstorage.setItem(); / localstorage.getItem(); auf dem lokalen Computer speichern (die meisten Browser haben etwa 5 MB Speicherplatz pro Domäne). Wenn Sie Daten in der Datenbank haben, die sich nicht so oft ändern, können Sie sie auf dem Client speichern und dann bei 'Start-up' überprüfen, ob das Datum immer noch gültig / gültig ist.

Dies ist mein erster Kommentar, nachdem ich das Konto 1 Jahr lang benutzt und benutzt habe, also muss ich vielleicht meine Wanderung verfeinern - einfach sagen, was ich gerade durch denke.

    
Felix Fearnley 20.05.2014 13:15
quelle

Tags und Links