Perché il tempo di caricamento della mia pagina è strettamente correlato al numero di query del database?

1

Ogni volta che faccio sviluppo web e una pagina impiega più di mezzo secondo per essere generata, so che da qualche parte il mio codice sta colpendo il DB troppe volte. Il modo normale per risolvere questa situazione è chiedere al DB tutte le informazioni contemporaneamente, facendo JOINs e cose simili.

La mia domanda è: perché molte query sul database rendono una pagina lenta? Ci deve essere un sovraccarico considerevole per ogni query, ma che cos'è?

EDIT : Ok, facciamo un esempio (è un po 'sciocco e piccolo, ma lo farà)

people table:

| name | football_team_id | 
+------+------------------+
| jim  | 1                |
| mike | 3                |
| carl | 2                |

football_team table:

| id | color |
+----+-------+
| 1  | red   |
| 2  | blue  |
| 3  | green |

Sappiamo tutti che questo è lento:

SELECT name,football_team_id FROM people;
# start rendering the page, realise we need colors
SELECT color FROM football_team WHERE id=1
# oops, need mike's color
SELECT color FROM football_team WHERE id=3
# oh, and carl's
SELECT color FROM football_team WHERE id=2

Questo è un po 'meglio:

SELECT name,football_team_id FROM people;
SELECT id,color FROM football_team WHERE id IN (1,3,2)

Questo è il migliore:

SELECT name,football_team_id,color FROM people JOIN football_team ON people.football_team_id=football_team.id

In ogni esempio riceviamo la stessa quantità di dati, ma quest'ultima è facilmente la più veloce.

Non ti aspetteresti lo stesso comportamento se ad esempio stai leggendo da un descrittore di file.

    
posta joerick 28.02.2014 - 13:42
fonte

3 risposte

2

Ho profilato un numero di applicazioni e ho scoperto che:

  • La creazione di una connessione al database è in genere l'operazione più costosa (tra 700-1500 + ms su molti database principali)
  • Sul server di database, le query più semplici come quelle elencate nella tua domanda richiedono pochissimo tempo per essere eseguite (tra 1-20ms misurati sul server)
  • Viene impiegata una buona parte del tempo per trasferire i dati dal database alla pagina Web (circa 100-300 ms per query semplice).

Armati di queste informazioni, se al momento non stai effettuando il caching delle connessioni, ora è un ottimo momento per iniziare. Puoi vedere che il tempo effettivo per eseguire una query è davvero trascurabile. Il problema è il tempo di riportare effettivamente i dati nella tua app Web.

Che cosa sta succedendo?

Troverete che la maggior parte dei protocolli di database sono molto "chiacchieroni". Fondamentalmente, inviano i byte avanti e indietro in modo che il database e il client sappiano che sono ancora presenti e che il client ha le autorizzazioni appropriate, ecc. In alcuni casi c'è un sovraccarico quando i cursori sono condivisi tra server e client.

Il server del database restituisce risultati in blocchi e il driver potrebbe dover inviare conferme per consentire al server di sapere che il blocco è stato ricevuto correttamente. Il driver deve quindi prendere questi blocchi e rappresentare in un modo che l'applicazione può utilizzare. Tutta questa elaborazione richiede tempo.

Tutte le comunicazioni hanno un paio di proprietà che influiscono sul tempo di trasmissione:

  • Latenza: il ritardo tra il momento in cui un pacchetto viene inviato al momento in cui viene ricevuto.
  • Velocità di trasmissione: il numero di bit / byte al secondo supportati dal filo.

Maggiore è il numero di firewall, router e altri dispositivi di infrastruttura tra l'app e il database più aumenta la latenza. La velocità di trasmissione è qualcosa con cui siamo più familiari, perché sappiamo che i server sono collegati con 10baseT, 100baseT o 1000baseT Ethernet (10, 100, 1000 milioni di bit al secondo rispettivamente).

Se hai una larghezza di banda elevata quando i dati si spostano, si muove molto rapidamente. L'elevata latenza può rendere le comunicazioni con il database molto più lente di quanto dovrebbe essere dovuto ai piccoli pacchetti che si spostano avanti e indietro tra il database e l'applicazione.

Come ti occupi di esso?

Uno dei modi migliori per ridurre al minimo il costo di gestione del database è di ridurre al minimo il numero di volte che si chiama il database. Inoltre, ti consigliamo di assicurarti di ottenere solo i dati che devi effettivamente visualizzare.

In alcuni casi è possibile utilizzare un caching intelligente in modo da non dover assolutamente toccare il database per alcune parti delle pagine che si devono rendere.

    
risposta data 28.02.2014 - 21:46
fonte
6

Why do many database queries make a page slow? Why does a large number of anything make a page slow?

Fai qualcosa una volta e ci vuole "un po 'di tempo".

Fai la stessa cosa a mille volte e sì; ci vorranno [all'incirca] mille volte più a lungo. Non c'è magia qui. A meno che non inizi a parallelizzare e multi-threading i tuoi programmi, tutto verrà fatto "una cosa dopo l'altra".

Sì; ottenere una connessione al database e usarlo fa ha un sovraccarico, anche se cose come il Connection Pooling servono a diminuire l'impatto, ma più volte si va al database, le cose più lunghe stanno andando a prendere.

Inoltre, fai attenzione alla quantità di dati che stai ritirando. " select * " sembra fare qualcosa di un ritorno nelle comunità di codifica "Newbie" al momento. Ottimo se il tuo tavolo ha tre colonne e le vuoi tutte e tre. Non va bene se vuoi solo tre colonne ma i tuoi tavoli come "in qualche modo" ne hanno acquisiti altri dodici; tutti loro enormi campi di testo!

(Ricorda: sei non l'unico utente del database " tuo ").

    
risposta data 28.02.2014 - 14:20
fonte
4

Generalmente è ciò che chiamiamo "over-the-wire overhead". In molti server, il database si trova su un computer diverso rispetto all'app del server. (Ciò ha anche vantaggi di scalabilità.) Ciò significa che qualsiasi chiamata al database deve passare attraverso una connessione di rete e tutti i risultati devono essere reinseriti sulla rete. Il costo di tale overhead, anche se la macchina si trova solo a pochi metri da quella che ospita l'app del server, può sommarsi molto rapidamente.

    
risposta data 28.02.2014 - 13:48
fonte

Leggi altre domande sui tag