Visualizzazione risultati 1 fino 6 di 6

Discussione: [mysql] Impegno di risorse nei select nidificati.

  1. #1
    aldigi non è connesso Neofita
    Data registrazione
    07-02-2006
    Messaggi
    4

    Predefinito [mysql] Impegno di risorse nei select nidificati.

    Ciao a Tutti,

    questo è il mio primo messaggio e speravo di iniziare con qualcosa di un po più leggero, ma i problemi non si possono scegliere purtroppo!

    Veniamo a noi, ho recentemente scritto la seguente query:

    Codice PHP:
    SELECT D.coll1,SUM(D.coll2),X.coll4,X.coll5 FROM tab1 AS D LEFT JOIN tab1 AS X ON X.ID = (SELECT MAX(ID) FROM tab1 WHERE D.coll1 = coll1 ) GROUP BY D.coll1
    ID = indice auto incrementante e P.K.

    Lo scopo di questa contorta query è quello di ottenere la somma di "coll2" e gli ultimi valori immessi di "coll4" e "coll5" raggruppati per "coll1".

    Incredibilmente tutto funziona, ottengo esattamente i risultati che volevo ottenere, ma ora mi chiedo se "coll1" è composto, ad esempio, da 100 elementi distinti il secondo SELECT viene eseguito 100 volte eseguendo complessivamente 101 query o viene eseguito una sola volta eseguendo soltanto due query.

    Spero di essere stato chiaro nell’illustrare il mio dubbio.

    Ciao e grazie a Tutti
    AlDiGi

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Puoi vedere cosa farebbe una determinata query usando il comando EXPLAIN. Il conteggio di query sarà sempre uno, ma con le query annidate verranno la singola query verrà eseguita in più passi.
    In base al numero di righe, alla complessità della query e alla presenza di indici si può decidere di spezzare la query in più parti.


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  3. #3
    aldigi non è connesso Neofita
    Data registrazione
    07-02-2006
    Messaggi
    4

    Predefinito

    Grazie per la risposta, purtroppo off-line ho problemi con EXPLAIN ( nessun effetto ).
    Il fatto è che la mia query, qui estremamente semplificata, verrà utilizzata per la scansione di un forum che può tranquillamente raggiungere le 500.000 righe.
    Il mio dubbio è: Se il secondo SELECT viene richiamato una singola volta allora tutto bene, ma se viene richiamato per ogni singola riga ( 500.000 ) il carico di lavoro per MySql diverrà insostenibile.

    Nella peggiore delle ipotesi, potrei suddividere la query in questo modo:

    Prima query.
    Codice PHP:
    SELECT MAX(ID) FROM tab1 GROUP BY D.coll1
    Seconda query.
    Codice PHP:
    SELECT D.coll1,SUM(D.coll2),X.coll4,X.coll5 FROM tab1 AS D LEFT JOIN tab1 AS X ON X.ID IN(risultato prima query) GROUP BY D.coll1
    Ciao e grazie
    AlDiGi

  4. #4
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Provando a imitare la tua query e a fare un EXPLAIN sembrerebbe che il vincolo in cui compare la sottoquery venga eseguito in un secondo momento sfruttando l'indice su ID, ma la prima parte di query prende come risultato tutta la tabella.
    Per questo motivo, se sono mezzo milione di righe, conviene spezzare.

    Cambierei anche questo:
    Codice:
    ON X.ID IN(risultato prima query)
    In questo

    Codice:
    ON X.ID = (risultato prima query)


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


  5. #5
    aldigi non è connesso Neofita
    Data registrazione
    07-02-2006
    Messaggi
    4

    Predefinito

    Ti ringrazio, farò come consigli.
    Per la modifica della del vincolo, non è possibile sostituire l’IN con "=" perché il risultato della prima query non è un singolo numero, bensì un insieme di tutti i massimi ID dei vari gruppi che tramite PHP ho riversato in una variabile separati da virgole.

    Grazie AlDiGi.

  6. #6
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Citazione Originalmente inviato da aldigi Visualizza messaggio
    Per la modifica della del vincolo, non è possibile sostituire l’IN con "=" perché il risultato della prima query non è un singolo numero, bensì un insieme di tutti i massimi ID dei vari gruppi che tramite PHP ho riversato in una variabile separati da virgole.
    Hai ragione


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •