2012-06-20 2 views
7

Qualcuno ha richiamato la funzione multi_query MySQLi in una risposta affermando che sarebbe stato meglio che eseguire il ciclo di 3 query separate. Ho provato a Google una sorta di risposta a questo, ma in realtà non ho ottenuto nulla che soddisfacesse davvero la mia curiosità quindi spero che voi ragazzi possiate avere una visione migliore dei motivi per usarlo piuttosto che salvare poche righe di codice.mysqli :: multi_query è più efficiente di diverse query singole?

Così qui è quello che chiedo:

  1. Cosa sta facendo multi_query sotto il cofano?
  2. Il multi_query colpisce semplicemente il server x numero di volte e aggrega i risultati?
  3. C'è un caso in cui le singole query possono essere più efficienti di più query?

So che colpisce il database di 3 volte per un milione di articoli ogni e schiacciandolo in un unico grande oggetto non è un bene per l'utilizzo della memoria, ma so che ci deve essere una ragione per la sua esistenza e sono anche sicuro che ci sono momenti in cui dovrebbe essere evitato. Spero di capirlo meglio in modo che possa metterlo nella mia borsa di trucchi quando se ne presenti la necessità.

Grazie per il vostro tempo!

+0

Lo scenario sembra più simile all'opzione MYSQLI_ASYNC in mysqli_query(). –

risposta

11
  • What is multi_query doing under the hood? - solo l'invio di tutte le query al server in una volta, invece di uno alla volta, e il recupero di tutti i risultati in una sola volta. Niente di più complicato di così.

  • Does multi_query simply hit the server x number of times and aggregates the results? - "colpisce" il server due volte, una volta per inviare le query e una volta per recuperare i risultati.

  • Is there a case where single queries may be more efficient than multiple queries? - dipende da come si definisce "efficiente". multi_query() è leggero sulla rete, ma la memoria è pesante, esegue query() in un ciclo viceversa.

    Per molti SELECT affermazioni che restituiscono grande risultato imposta la perdita di consumo di memoria è probabile che superano di gran lunga il guadagno in termini di rete e la maggior parte del tempo che sarebbe meglio per il rilascio delle query ed elaborare il risultato imposta uno alla volta - anche se questo dipende esattamente da quello che stai facendo con i dati. Tuttavia, se è necessario eseguire molte istruzioni UPDATE, è probabile che sia multi_query() migliore poiché i valori restituiti sono solo successi/errori e il consumo di memoria sarà leggero.

    Si dovrebbero valutare tutti i fattori come quello che si sta facendo, quanto tempo ci si aspetta che prenda, la latenza di rete tra il server (database) e il client, le risorse disponibili (principalmente memoria) sul server e il cliente, ecc. ecc. e lo prendiamo caso per caso.

ho trovato questo record of some performance testing fatto qualche tempo fa, in cui la conclusione è che ci sia un guadagno complessivo di efficienza per essere trovato da utilizzare multi_query(). Tuttavia il test case stava semplicemente eseguendo 4 query, ognuna delle quali SELECT un singolo risultato, e la definizione di "più efficiente" è semplicemente "più veloce". Non ci sono test per un numero maggiore di query o set di risultati più grandi e, mentre la velocità è importante, non è l'essere tutto e il tutto alla fine - posso far girare tutto incredibilmente velocemente se gli do una quantità illimitata di memoria, ma un tentativo di fare qualcosa contemporaneamente fallirà miseramente.Non è nemmeno un test del mondo reale, dal momento che il risultato finale potrebbe essere raggiunto con una query singola JOIN edita. Però fa per qualche lettura interessante però.

Personalmente sento che questo è un po 'accademica, perché se si sono esecuzione di un ampio set di istruzioni in una sola volta, il 90% del tempo che varierà solo nella dati che viene passata e la struttura di query rimarrà lo stesso - che è un candidato ovvio per le dichiarazioni preparate.

+0

+1 per chiarezza e impegno. – brezanac

+0

@DaveRandom Grazie per la tua eccellente risposta. Quindi multi_query non è necessariamente più efficiente sul server, ma salva solo alcuni viaggi sul server db. Onestamente non riesco a vedere come questo sarebbe mai veramente utile a meno che tu non stia facendo aggiornamenti o creazioni o qualcosa che ritorni un booleano come hai detto tu. Grazie per aver alimentato la mia curiosità. – EmmanuelG

1

La risposta sopra è errata.

Cosa fa multi_query sotto il cofano?

Semplicemente invia tutte le query al server in una volta, mentre recupera il risultato solo per il primo. Quindi, in effetti, multi_query è una sorta di wrapper per l'esecuzione di query asincrone .

Does multi_query semplicemente colpire il numero x di server di volte e aggrega i risultati?

multi_query colpisce il server una sola volta. Tutti gli altri hit che devi fare manualmente, chiamando next_result, per ottenere tutti i risultati delle altre query.

C'è un caso in cui le singole query possono essere più efficienti di più query?

questa domanda presuppone che ci sia un caso in cui multi_query è più veloce. Che è una dichiarazione discutibile. Per la normale query, la latenza della rete è una parte trascurabile dell'intero tempo di esecuzione. Se sei in realtà interessato nella velocità di tale margine, dai uno sguardo al HandlerSocket - sarà incredibilmente veloce. Tuttavia, per uno sviluppo regolare una tale differenza tra query singola e multipla sarebbe la tua preoccupazione minore. Se ti interessa la vita reale conta, non quelli immaginari.