Domanda

Ho due MySQL query che sia i dati inserire in una tabella. Entrambi hanno il seguente formato:

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1

Le uniche differenze tra i due query sono come field1 e field2 sono determinati, e alcune piccole differenze nella clausola condizioni. Entrambi eseguire fino a 12K e più record.

Ora, quello che sarà più efficiente:

A. Eseguire entrambe le query a parte:

if (mysql_query($query1)) {
    return mysql_query($query2);
}
return false;

B. O combinare le due query con UNION, ed eseguire una volta:

$query = 'SELECT `field1`, `field2` WHERE `active` = 1
            UNION 
            SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1
            ORDER BY `field1`';
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
) ' . $query)

I dati da una query è inutile senza i dati dall'altro, in modo che entrambi hanno bisogno per avere successo. DO_ONE e DO_TWO sono definite dall'utente funzioni di MySQL che modificano i dati di campo secondo alcune specifiche.

È stato utile?

Soluzione

La risposta di Aaronmccall è probabilmente il migliore in generale - l'approccio UNIONE fa tutto in una sola chiamata SQL. In generale, che sarà il più "efficiente", ma ci potrebbero essere problemi collaterali che potrebbero entrare in gioco e influenzare la misura della "efficiente" per una particolare applicazione.

In particolare, se l'Unione richiede una tabella temporanea per raccogliere i risultati intermedi e si sta lavorando con molto grandi insiemi di dati, quindi facendo due SELECT rettilinei separati nella nuova tabella potrebbe rivelarsi essere più efficiente nel vostro caso particolare. Questo dipenderà il funzionamento interno, le ottimizzazioni fatte, ecc all'interno del motore di database (che potrebbe cambiare a seconda della versione del motore di database in uso).

In ultima analisi, l'unico modo per rispondere alla tua domanda su una questione così specifica come questo potrebbe essere quello di fare tempi per una particolare applicazione e l'ambiente.

Si potrebbe anche prendere in considerazione che la differenza tra il tempo necessario per due query separate vs un "all in one" query potrebbe essere insignificante nel grande schema delle cose ... probabilmente stai parlando di una differenza di pochi millisecondi (o anche microsecondi?) a meno che il vostro database MySQL è su un server separato con problemi di latenza enormi. Se stai facendo migliaia di queste chiamate in un solo colpo, allora la differenza potrebbe essere significativo, ma se si sta solo facendo uno o due di queste chiamate e la vostra applicazione sta spendendo il 99,99% del suo tempo l'esecuzione di altre cose, allora la differenza tra il due probabilmente non sarà nemmeno essere notato.

--- Lawrence

Altri suggerimenti

L'approccio UNION dovrebbe assolutamente essere più veloce a causa della spesa di fare due chiamate API da MySQL PHP vs uno.

Le opzioni fanno cose diverse. Primo restituisce i risultati della seconda query se la prima query viene eseguita correttamente (che è BTW indipendente dei risultati che restituisce, può essere restituisce un set di righe vuoto). Secondo uno restituisce i risultati della prima query e la seconda query insieme. Prima opzione mi sembra abbastanza inutile, probabilmente quello che si vuole raggiungere è quello che hai fatto con l'Unione (a meno che non si missunderstood).

EDIT: Dopo aver letto il tuo commento, credo che siete alla ricerca di qualcosa di simile:

selezionare True dove (esiste (SELECT campo1, campo2 ...) ed esiste (SELECT campo1, campo2 ...)).

In questo modo si avrà una sola query al DB, che scala meglio, richiede meno risorse dal pool di connessioni e non raddoppiare l'impatto della latenza se avete il vostro motore di DB in un server diverso, ma si continua a interrompere la query se la prima condizione non riesce, che è il miglioramento delle prestazioni che stavi cercando con le query nidificate separate.

Come un'ottimizzazione, cercare di avere prima la condizione che eseguirà più veloce, nel caso in cui essi non sono la stessa cosa. Suppongo che se uno di loro richiede coloro campo calcoli sarebbero più lento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top