Join tra tabelle corpose | La nostra community

Topic: Pubblico - Composto da 11 Posts di 3 Utenti.

11 Luglio, 2011 17:13 #1
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Salve a tutti quelli che leggono questo post. Mi trovo ad affrontare il seguente problema:
Effettuo una select su varie tabelle collegate con 2 o + join tra loro.
Due delle tabelle in questione("utenti" e "azioni") sono molto corpose, e col passare del tempo il numero di tuple di ognuna delle due crescerà. La query prevede dei filtri sul risultato mediante clausole WHERE ma ovviamente i vari JOIN vengono effettuati prima sulla totalità dei record e poi filtrati. Questo comporta un rallentamento esagerato sulla restituzione dei risultati. Come posso velocizzare questa procedura tenendo conto che le tabelle in questione contengono tuple nell'ordine di decine di migliaia.

Grazie a chiunque possa darmi una risposta o un input

12 Luglio, 2011 07:52 #2
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Dopo altre prove ho verificato che il rallentamento è dovuto ad un altro join con una tabella relativamente piccola (1500 tuple). Quello che ho potuto constatare è che la differenza sostanziale sui tempi di calcolo è dovuta al fatto che quest'ultimo sia di tipo LEFT (come mi occorre) piuttosto che INNER. Se testo con l'INNER JOIN i tempi di calcolo si riducono notevolmente, ma i risultati (ridotti da quest'ulteriore filtraggio) ovviamente non sono quelli che mi occorrono.
Qualcuno ha qualche suggerimento o illuminazione?

14 Luglio, 2011 07:35 #3
g2d
Moderatore

g2d
Registrato: Jul, 2008
Posts: 957
Offline
Segui g2d su Twitter!

Ciao,

per aiutarti ci devi postare la definizione delle tabelle e le query..

altrimenti non risuciamo ad aiutarti

ciauz


Un tempo ero algweb ora sono g2d

14 Luglio, 2011 09:34 #4
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

mi accodo ad algweb nel consigliarti di postare anche la struttura delle tabelle per capire meglio la problematica, così su due piedi, senza conoscere la struttura potrei consigliarti, se non lo hai già fatto, di creare degli indici per i campi comuni alle due tabelle che metti in join, questo dovrebbe dare alla query una bella botta di vita.


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

15 Luglio, 2011 09:39 #5
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Grazie per le risposte, riassumo le strutture:
TBL CLIENTI: 90.000 record
TBL TELEFONATE: 66.000 record
TBL APPUNTAMENTI: 1.800 record

DB

QUERY
"SELECT * FROM telefonate AS tb_1
INNER JOIN clienti AS tb_2 ON (tb_1.idcliente = tb_2.id)
LEFT JOIN appuntamenti AS tb_3 ON (tb_3.idtel = tb_1.id)"

Grazie ancora, Serve altro?

Ultima modifica 15 Luglio, 2011 09:47 di g2d

15 Luglio, 2011 09:41 #6
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Immagine:
http://imageshack.us/photo/my-images/828/18731353.jpg/

15 Luglio, 2011 12:57 #7
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

I tre campi "id" presumo siano chiavi univoche autoincrement, giusto?
Per quanto riguarda i campi appuntamenti.idcliente, appuntamenti.idtel e telefonate.idcliente, dovresti creare degli indici che includono questi campi, così mysql avrà qualche riferimento in più per associare più velocemente i record durante una join.


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

15 Luglio, 2011 13:53 #8
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Sì, i campi "id" sono chiavi autoincrement. Per la creazione degli indici potresti, se non è troppo disturbo, indicarmi come e cosa fare...nel senso che ho sentito parlare spesso di indici ma nn so proprio da dove iniziare, che tipo di indici creare, come associarli a quei campi, di cosa necessitano ulteriormente e in che modo questi influiscano su tutto il resto del database... Penso abbiano anche qualche contro oltre ai pro, altrim sarebbero implementati di default, giusto?

Grazie ancora per l'immensa disponibilità

18 Luglio, 2011 11:23 #9
re-verse
Moderatore

re-verse
Registrato: Jul, 2008
Posts: 312
Offline

Beh... utilizzare un indice qualsiasi per una qualsiasi tabella significa per mysql che deve fare una cosa in più e registrare un dato in più per ogni record inserito... detta così può sembrare pesante ma ti posso assicurare che non lo è poiché il vantaggio di avere degli indici strutturati bene può influenzare in modo drastico la lettura di tabelle grandi o in join. Non so se usi un'interfaccia grafica per collegarti a mysql, io uso heidisql che è gratuito, da lì ci vuole poco, vai nelle proprietà della tabella dove hai la possibilità di creare un indice. Se devi farlo da riga di comando serve un pò di sintassi: http://dev.mysql.com/doc/refman/5.1/en/create-index.html

Spero di esserti stato utile :)


Salvatore DC

La mente è come un paracadute: funziona solo se si apre. A.Einstein.

18 Luglio, 2011 12:31 #10
avcom
Utente

avcom
Registrato: Jun, 2010
Posts: 12
Offline

Grazie Re-verse! uso un'interfaccia grafica quindi mi è facile crearli.
Devo semplicemente creare indici di tipo INDEX sui soli campi che intevengono nelle JOIN?

Grazie ancora

Condividi su:

Loggati o Registrati per replicare