mysql ruft assoc VS mysql fetch array ab

8

Im Folgenden sind zwei Methoden, die in den meisten PHP-Codes zum Abrufen von MySQL-Daten verwendet werden.

  1. mysql_fetch_array()
  2. 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?

    
Saimon Avazian 02.03.2012, 21:16
quelle

10 Antworten

15

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] .

    
The Coder 02.03.2012 21:25
quelle
1

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 machen     
cyrusv 02.03.2012 21:21
quelle
1

Der 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.

    
Mark Baker 02.03.2012 21:28
quelle
1

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 .

    
Linus Kleen 02.03.2012 21:25
quelle
1

Dies ist das Ergebnis von   mysql_fetch_array ()

%Vor%

oder

%Vor%

Dies ist das Ergebnis von mysql_fetch_assoc () gibt nur

zurück %Vor%     
Oblivion Datta 07.05.2015 17:22
quelle
0

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.

    
Ryan P 02.03.2012 21:23
quelle
0

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!

    
christophmccann 02.03.2012 21:23
quelle
0

Nun Ссылка gibt

an
  

Hinweis: 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.

    
Randrian 13.12.2015 12:01
quelle
0

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:

%Vor%

Wenn beide Tabellen eine Spalte mit dem Namen 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!

Sie können dieses Problem doppelter Spaltennamen umgehen und weiterhin fetch_assoc() verwenden, indem Sie Ihre SELECT -Spalten manuell mit Aliasnamen versehen und jeder Spalte einen eindeutigen Alias ​​zuweisen:

%Vor%

Oder Sie können zur Verwendung von fetch_array() wechseln, was Ihnen den Zugriff auf id nach Index anstatt nach Schlüssel

ermöglicht     
rmirabelle 12.08.2016 17:32
quelle
-1

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.

    
Nimes 21.03.2017 23:25
quelle

Tags und Links