2013-04-08 13 views
5

Quale il seguito approcci è più efficiente:Più piccole query rispetto a una singola query lunga. Qual è più efficiente?

  1. singola query più:

    "SELECT COUNT(*) AS num 
    FROM (
    
        SELECT users.UID, cnumber 
        FROM users 
        JOIN identity ON users.UID = identity.UID 
        WHERE 'abc' 
        IN (google, facebook, twitter, linkedin) 
    
    ) AS userfound 
    JOIN jobs ON userfound.cnumber = jobs.cnumber 
    WHERE JID = 24"; 
    
    
    if(resultfromquery == 1) 
        //Some code here 
    else 
        //Some code here 
    
  2. Rompere la query più in più singoli query di tabella:

    uid = "SELECT UID FROM identity WHERE 'abc' IN (google, facebook, twitter, linkedin)"; 
    cnumber_from_usertable = "SELECT cnumber FROM users WHERE UID = 'uid'"; 
    cnumber_from_jobtable = "SELECT cnumber FROM jobs WHERE JID = 24"; 
    
    if(cnumber_from_usertable == cnumber_from_jobtable) 
        //Some code here 
    else 
        //Some code here 
    
+1

Cosa hai osservato quando l'hai provato? – symcbean

+0

C'è un overhead notevole per eseguire solo una query. Quindi facendo piccole query ha quel sovraccarico più volte. A meno che la tua query di grandi dimensioni non sia abbastanza efficiente, sarà più efficiente di molte piccole query. Con il tuo esempio qui la differenza è probabilmente minuscola, ma dove diventa molto evidente è quando esegui un ciclo intorno ai risultati di una query ed esegui un'altra query per ogni risultato. – Kickstart

+0

Sì, esattamente. Il DB è praticamente vuoto. Non c'è praticamente alcuna differenza tra i due, al momento. Quindi, ho due menti su quale andare con. –

risposta

6

misurare la differenza microtime ;-) I sarebbe andato con la singola query, meno connessioni, meno tempo di attesa ed è stato progettato per gestire questo tipo di cose.

http://www.phpjabbers.com/measuring-php-page-load-time-php17.html

<?php 
$time = microtime(); 
$time = explode(' ', $time); 
$time = $time[1] + $time[0]; 
$start = $time; 
?> 
"SELECT COUNT(*) AS 
FROM (

    SELECT users.UID, cnumber 
    FROM users 
    JOIN identity ON users.UID = identity.UID 
    WHERE 'abc' 
    IN (google, facebook, twitter, linkedin) 

) AS userfound 
JOIN jobs ON userfound.cnumber = jobs.cnumber 
WHERE JID = 24"; 


if(resultfromquery == 1) 
    //Some code here 
else 
    //Some code here 

<?php 
$time = microtime(); 
$time = explode(' ', $time); 
$time = $time[1] + $time[0]; 
$finish = $time; 
$total_time = round(($finish - $start), 4); 
echo 'Page generated in '.$total_time.' seconds.'; 
?> 
3

realtà ho vista un po 'diverso su questo. Le subquery di supporto di MySQL e uno dei motivi per cui vi è un'interruzione della query più grande in più piccola. Se si sta utilizzando il motore INNODB e si stanno utilizzando i parametri correttamente, ad esempio tabella tmp, tabella heap, bufferpool o cache di query, è possibile ottenere risultati migliori rispetto alle query più piccole. MYSQL è stato progettato per eseguire un sacco di piccole query, quindi sarebbe meglio avere più query di piccole dimensioni quindi una query più grande.

Se una query più ampia era un'opzione migliore, non avevamo la necessità di creare strumenti come Infinidb e INfobright che utilizza la struttura basata su colonne per eseguire query di grandi dimensioni, dove MYSQL è basato su righe.

Quindi, pensateci, le query di piccole dimensioni risulterebbero migliori di una singola query di grandi dimensioni e il sovraccarico non è di query è di connessioni e di nuovo MYSQL è molto economico con le connessioni, quindi non preoccupatevi. BUt se il tuo MYSQL sta creando thread allora non hai nulla di cui preoccuparti.

In breve, alcune piccole query vs query di grandi dimensioni giganti sarebbero la mia scelta.

+0

Questo è un POV interessante. Potresti per favore elaborare "MYSQL è stato progettato per eseguire un sacco di piccole query"? –

+1

In effetti molte persone non si rendono conto di questo, ma se si usano saggiamente le tue capacità di sviluppo e si memorizzano i risultati nelle tabelle tmp in modo efficiente, le piccole query faranno la magia. E come ho detto MYSQL è basato su righe, per set più grandi è necessario spostarsi nei database colonnari. Con MYSQL avresti bisogno di fare il partizionamento della tabella alla fine per ottenere risultati più veloci, il che ci dice che MYSQL preferisce le query più piccole. –

Problemi correlati