[Php-it] scelte prestazionali

Domenico L. domenico.lorusso at pleiade.it
Mon Oct 2 11:01:45 CEST 2006


Luca 'Ziabice' Gambetta ha scritto:
> On Thursday 28 September 2006 16:19, Emiliano Gabrielli (aka AlberT) wrote:
>   
> Tempo fa sono stato costretto a far fare tutte le operazioni su un db a php 
> perché semplicemente il db server si coricava. Lo scenario era una tabella 
> mysql (invero normalizzata molto male) con circa 1 milione di record di cui 
> ovviamente ne prendevo una parte (tra i 20 e i 100 mila record, a seconda dei 
> casi) e che dovevo incrociare con altre tabelle per eseguire delle 
> sincronizzazioni.

I dbms non sono in grado di sostituire il progettista.

Mi sembra di capire che nel tuo caso specifico con qualsiasi dbms 
avresti dovuto fare dei giri, al più avresti potuto creare delle stored 
procedure (soluzione più veloce e pulita).

Nel computo delle performance bisogna sempre tener conto non tanto del 
numero di record ma del numero di blocchi che si leggono.

Se la tabella cui ti riferivi aveva molti attributi e i record sono 
molto sparsi rispetto al criterio di estrazione, significa che per ogni 
query devi farti delle full table scan.

A questo punto per qualsiasi dbms la soluzione migliore è quella di 
popolare una tabella temporanea con solo gli attributi che ti 
interessano (magari solo le chiavi primarie) magari utilizzando una 
struttura ordinata in struttura primaria (in oracle si chiamano IOT) o 
di una hash table (detti anche cluster), queste sono le finezze che 
incontri quando parli di dbms seri, ma la sostanza di utilizzare una 
tabella di appoggio resta la stessa.

Preciso che naturalmente procedendo con una insert su una tabella dei 
soli attributi necessari otterremo una tabella con blocchi molto densi 
quindi pochi accessi al disco, ciò non di meno è cmq consigliabili 
definire degli indici ad hoc su questa tabella, perché mica sempre si 
accederà in FTS

Per capire che è meglio far fare a mysql il lavoro di mysql e non a php 
basta pensare che un record estratto da php viene messo in un array 
(simile agli hashmap di java) dove (non sono sicuro che sia esattamente 
così ma è verosimile) per ogni accesso è richiesto di calcolare una 
funzione per capire dove si trova la struttura, struttura che ovviamente 
non è tipizzata e non ha delle lunghezze prefissate per cui bisogna 
leggere campo per campo (e stiamo parlando di un altro array, di 
un'altra funzione di hashing...) la sua dimensione.

Tutto questo overhead mysql non l'ha, oltre che ricordarsi che php non è 
ottimizzato, non è compilato (è compilato on demand ma non è la stessa 
cosa) e non ha i controlli di tipi, questo vuol dire che la gestione 
degli errori di tipo di solito effettuato in tempo di compilazione passa 
in run time...


Ciao

-- 
Domenico L.

per stupire mezz'ora basta un libro di storia,
io cercai di imparare la Treccani a memoria... [F.d.A.]



More information about the Php-it mailing list