Im Folgenden sind zwei Methoden, die in den meisten PHP-Codes zum Abrufen von MySQL-Daten verwendet werden.
mysql_fetch_array()
mysql_fetch_assoc()
Jetzt habe ich eine große Datenbank. Zum Abrufen von Daten in Schleifen ( while
) Was ist schneller und besser?
Ich fand dieser Benchmark .
Was ist Ihre Wahl?
Es hängt davon ab, wie Ihre Tabellen eingerichtet sind:
mysql_fetch_array()
gibt im Wesentlichen zwei Arrays zurück, eins mit numerischem Index, eins mit assoziativem String-Index.
Wenn Sie also mysql_fetch_array()
verwenden, ohne MYSQL_ASSOC
oder MYSQL_NUM
anzugeben, oder MYSQL_BOTH
angeben, werden zwei Arrays zurückgegeben (im Grunde, was mysql_fetch_assoc()
und mysql_fetch_row()
zurückgeben würden), also mysql_fetch_assoc()
ist schneller.
Wenn Sie Ihre Tabelle richtig eingerichtet haben und die Abfrage richtig geschrieben wurde mysql_fetch_assoc()
ist der Weg zu gehen, Code Lesbarkeit weise $result['username']
ist leichter zu verstehen als $result[0]
.
Ich bevorzuge fetch_assoc. Es gibt ein "assoziatives Array" (wie ein Python-Wörterbuch) zurück. Das bedeutet, dass Ihr Array nach String indiziert wird (in meinem üblichen Fall).
Der Standardwert für fetch_array gibt sowohl nummerierte Indizes als auch assoziative Indizes an.
Aber ich benutze nie die nummerierten Indizes, also möchte ich es mit fetch_assoc
etwas schneller machenDer in Ihrem Beispiel gezeigte benchark verwendet mysql_fetch_array () ohne irgendein Argument, um MYSQL_ASSOC oder MYSQL_NUM zu spezifizieren, deshalb ist es standardmäßig MYSQL_BOTH ... dies wird das Ergebnis eher verzerren, da es doppelt so viele Array-Elemente laden muss wie mysql_fetch_assoc () . Also ich würde vorschlagen, dass es keine gültige Benchmark ist.
In Wirklichkeit sollte es sehr wenig geben, um zwischen mysql_fetch_array () mit MYSQL_ASSOC und mysql_fetch_assoc () zu unterscheiden, und es ist natürlich nicht der größte Aufwand in Ihrem Skript.
Die "Größe" der Abfrageergebnisse spielt in diesem Fall keine Rolle.
mysql_fetch_array()
erzeugt im Allgemeinen Overhead, indem ein assoziatives Array plus indizierte Ergebnisse zurückgegeben wird.
Über die Art der Abfrage und die gewünschten Ergebnisse sollte entschieden werden, ob mysql_fetch_array()
oder mysql_fetch_assoc()
verwendet werden soll.
Wenn der Overhead "vernachlässigbar" ist und ich bin mir sicher, dass die Abfrage erfolgreich ist und ich weiß, dass es nur ein einziges Ergebnis gibt, mache ich gelegentlich:
%Vor% Für iterative Verfahren (wie eine while
-Schleife) schneidet das nicht ab. Wenn keine "schnell extrahierenden" Ergebnisse benötigt werden (über einen list
Operator) und das Ergebnis im Code weiterverarbeitet werden muss, verwende ich immer mysql_fetch_assoc()
*.
* Wenn Sie gezwungen sind, zu verwenden, sind die recht veralteten Funktionen zum prozeduralen Datenabruf von PHP. Es gibt Alternativen .
Dies ist das Ergebnis von mysql_fetch_array ()
%Vor%oder
%Vor%Dies ist das Ergebnis von mysql_fetch_assoc () gibt nur
zurück %Vor% mysql_fetch_assoc()
wäre wahrscheinlich die bessere Wahl. Es gibt einen leichten Leistungseinbruch (die mysql-Erweiterung muss die Spaltennamen nachschlagen, aber das sollte nur einmal vorkommen, egal wie viele Zeilen Sie haben), aber wahrscheinlich nicht genug, um stattdessen mysql_fetch_array()
zu verwenden. mysql_fetch_array()
kann nützlich sein, wenn Sie nur eine Spalte auswählen.
Ich nehme an, es hängt von Ihrer Definition von groß ab. Von diesem Benchmark können Sie sehen, dass Sie erst, wenn Sie mehr als 1.000.000 Millionen Abrufe durchführen, tatsächlich einen messbaren Unterschied feststellen? Ist Ihre Datenbank so groß? Wenn nicht, dann gehe mit dem, was für dich leichter zu benutzen ist (was wahrscheinlich ein assoziatives Array ist).
Ein weiterer Punkt, den es zu beachten gilt: Wenn es so groß ist, dass es einen messbaren Unterschied gibt, würde ich einen Weg finden, Funktionen wie diese alle zusammen zu verwenden. Erwägen Sie die Verwendung von MySQLi oder besser noch PDO!
Nun Ссылка gibt
anHinweis: Leistung
Es ist wichtig zu beachten, dass die Verwendung von mysql_fetch_assoc () nicht wesentlich langsamer ist als die Verwendung von mysql_fetch_row (), während es einen erheblichen Mehrwert bietet.
Der Unterschied sollte also nicht beunruhigend sein.
Ein weiterer zu beachtender Punkt ist, dass fetch_assoc()
möglicherweise nicht jede erwartete Spalte zurückgibt. Wenn 2 Ausgabespalten denselben Namen haben, wird nur die letzte Instanz dieser Spalte von fetch_assoc()
abgerufen. Zum Beispiel die folgende Abfrage:
Wenn beide Tabellen eine Spalte mit dem Namen Sie können dieses Problem doppelter Spaltennamen umgehen und weiterhin Oder Sie können zur Verwendung von id
aufweisen, würde das resultierende assoziative Array einen Schlüssel namens id
haben, dessen Wert auf line_items.id
gesetzt ist und Sie orders.id
nicht aus dem Ergebnis! fetch_assoc()
verwenden, indem Sie Ihre SELECT
-Spalten manuell mit Aliasnamen versehen und jeder Spalte einen eindeutigen Alias zuweisen: fetch_array()
wechseln, was Ihnen den Zugriff auf id
nach Index anstatt nach Schlüssel
mysql_fetch_array () vs mysql_fetch_assoc ()
mysql_fetch_array (): Gibt ein Array zurück, das der abgerufenen Zeile entspricht, und verschiebt den internen Datenzeiger nach vorne. für bessere Dokumentation klicken Sie hier! um mehr zu erfahren mysql_fetch_assoc (): entspricht dem Aufruf von mysql_fetch_array () mit MYSQL_ASSOC für den optionalen zweiten Parameter. Es gibt nur ein assoziatives Array zurück.