2012-03-02 31 views
8

Di seguito sono riportati due metodi comunemente utilizzati nella maggior parte dei codici php per recuperare i dati mysql.mysql fetch assoc VS mysql fetch array

  1. mysql_fetch_array()
  2. mysql_fetch_assoc()

Ora, ho un grande database. Per scaricare i dati nei loop (while) cosa è più veloce e migliore?

Ho trovato this benchmark.

Qual è la vostra scelta?

+1

Preferisco il percorso ASSOC, semplicemente perché è più facile leggere il mio codice ...: P Questa non è una domanda, ma è una tua opinione, comunque. – user17753

+0

'mysql_fetch_assoc()' è più veloce (un po ') da solo. Ma vorrei anche ridurre l'ingombro del mio programma, quindi eviterei mysql_fetch_array() con 'MYSQL_BOTH' o opzione predefinita. – Imdad

+0

L'associazione è preferita durante l'aggiornamento di SQL deprecato che è il nome della colonna centrica. Inoltre, rende più semplice l'analisi dell'impatto con gli strumenti di tipo grep. – mckenzm

risposta

1

Preferisco fetch_assoc. Restituisce un "array associativo" (come un dizionario python). Ciò significa che il tuo array è indicizzato per stringa (nel mio solito caso).

Il valore predefinito per fetch_array fornisce sia indici numerati sia indici associativi.

Ma non ho mai utilizzare gli indici numerati, così mi piace farlo un pochino più veloce con fetch_assoc

0

mysql_fetch_assoc() sarebbe probabilmente la scelta migliore. C'è un leggero calo di prestazioni (l'estensione mysql deve cercare i nomi delle colonne, ma ciò dovrebbe accadere solo una volta, non importa quante righe hai), ma probabilmente non abbastanza da giustificare l'uso di mysql_fetch_array(). mysql_fetch_array() può essere utile se si sta selezionando solo una colonna.

0

Suppongo che dipenda dalla tua definizione di grande. Da quel punto di riferimento si può vedere che è solo prima di eseguire oltre 1.000.000 milioni di feti che si ottiene effettivamente una differenza misurabile? Il tuo database è così grande? In caso contrario, andare con quello che è più facile da usare (che è probabilmente quello di recuperare un array associativo).

Un altro punto da considerare, se è così grande che c'è una differenza misurabile, mi piacerebbe ottenere un modo di utilizzare funzioni del genere tutte insieme. Prendi in considerazione l'utilizzo di MySQLi o ancora meglio l'utilizzo di PDO!

15

Dipende da come le tabelle sono di impostazione:

mysql_fetch_array() restituisce essenzialmente due array uno con indice numerico, uno con indice di stringa associativa.

Quindi, utilizzando mysql_fetch_array() senza specificare MYSQL_ASSOC o MYSQL_NUM, oppure specificando MYSQL_BOTH restituirà due array (fondamentalmente ciò che mysql_fetch_assoc() e mysql_fetch_row() sarebbe ritorno) in modo mysql_fetch_assoc() è più veloce.

Se avete il vostro diritto di impostazione tavolo e interrogazione scritta correttamente mysql_fetch_assoc() è la strada da percorrere, la leggibilità del codice saggio $result['username'] è più facile da comprendere rispetto $result[0].

1

In questo caso, la "dimensione" dei risultati della query non è rilevante.

mysql_fetch_array() genera generalmente sovraccarico restituendo un array associativo più risultati indicizzati.

Si dovrebbe decidere il tipo di query ei risultati desiderati sull'uso di mysql_fetch_array() o mysql_fetch_assoc().

Se il sovraccarico è "trascurabile" e sono sicuro che la query ha successo e so che c'è solo un singolo risultato, tanto in tanto faccio:

$q = mysql_query('SELECT `column1`,`column2` FROM `table` WHERE `id` = 123'); 
list($column1,$column2) = mysql_fetch_array($q); 
mysql_free_result($q); 

Per i procedimenti iterativi (come un loop while), questo proprio non lo taglia. Quando non sono necessari risultati di "estrazione rapida" (tramite un operatore list) e il risultato deve essere ulteriormente elaborato in codice, io uso sempre mysql_fetch_assoc() *.


* quando è costretto a realtà uso i piuttosto antiquato funzioni procedurali di recupero dei dati di PHP. There are alternatives.

+0

si hai ragione. DOP è gr8 –

+0

Sì, lo è. A pensarci bene, PDO ha ancora le stesse opzioni. Puoi recuperare i dati * due volte * (usando 'PDO :: FETCH_ARRAY') o no (' PDO :: FETCH_ASSOC'). L'ultima parte della mia risposta, in realtà, era di suggerire tecniche più "avanzate" in PHP per recuperare i dati (e per [inserire coerenza nella risposta, in modo che non venga cancellata] (http: //meta.stackexchange. it/questions/124309/change-the-way-really-old-questions-are-deleted) ...) –

1

Il benchark mostrato nell'esempio utilizza mysql_fetch_array() senza alcun argomento per specificare MYSQL_ASSOC o MYSQL_NUM, quindi è impostato su MYSQL_BOTH in modo predefinito ... questo piuttosto distorce il risultato in quanto deve caricare il doppio degli elementi di array come mysql_fetch_assoc (). Quindi suggerirei che non è un punto di riferimento valido.

In realtà, ci dovrebbe essere molto poco per distinguere tra mysql_fetch_array() con MYSQL_ASSOC e mysql_fetch_assoc(), e ceraninly non sarà il più grande overhead nel tuo script.

1

questo è il risultato di mysql_fetch_array()

$row['fieldname'] = 'some value'; 

o

$row[0] = some value'; 

questo è il risultato di mysql_fetch_assoc() restituirà solo

$row['fieldname'] = 'some value'; 
0

Bene http://php.net/manual/en/function.mysql-fetch-assoc.php stati

Nota: Prestazioni

Una cosa importante da notare è che l'uso di mysql_fetch_assoc() non è significativamente più lento rispetto all'utilizzo mysql_fetch_row(), mentre fornisce un significativo valore aggiunto.

Quindi la differenza non dovrebbe essere qualcosa di cui preoccuparsi.

0

Un ulteriore punto da tenere presente è che fetch_assoc() potrebbe non restituire tutte le colonne previste. Se 2 colonne di output avranno lo stesso nome, solo l'ultima istanza di tale colonna verrà recuperata da fetch_assoc(). Ad esempio, la seguente query:

SELECT * FROM orders LEFT JOIN line_items ON orders.id = line_items.order_id 

Assumendo entrambe le tabelle hanno una colonna chiamata id, l'array associativo risultante avrebbe una chiave denominata id il cui valore è impostato su line_items.id e non sarebbe in grado di recuperare orders.id dal risultato!

È possibile aggirare questo duplicato problema nomi di colonna e continuare a utilizzare fetch_assoc() da aliasing manualmente i SELECT colonne, dando ogni colonna un alias univoco:

SELECT 
o.id AS order_id, #unique alias 
i.id AS line_item_id, #unique alias 
o.date, 
i.qty, 
i.price 
FROM orders o 
LEFT JOIN line_items i ON i.order_id = o.id 

Oppure si può passare ad usare fetch_array(), che vi permetterà di accedere sia id per indice invece che per chiave

-1

mysql_fetch_array() vs mysql_fetch_assoc()

mysql_fetch_array(): restituisce una matrice corrispondente alla riga recuperata e sposta il puntatore dati interno in avanti. for better documentation click here! to learn more mysql_fetch_assoc(): equivale a chiamare mysql_fetch_array() con MYSQL_ASSOC per il secondo parametro opzionale. Restituisce solo un array associativo.

+0

Questo in realtà non risponde alla domanda. – dash2