Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    ottimizzare query lenta

    ho questa query abbastanza complessa che vorrei velocizzare, qui si parla di 9/10 secondi di tempo , il server è dedicato e la RAM spesso è usata al 20/30%.

    vorrei valutare alcune strade:

    1) mi conviene creare qualche indice ulteriore per velocizzarla?

    2) Devo aumentare la memoria dedicata alle funzioni JOIN sul my.cnf?

    3) Devo utilizzare il motore Innodb al posto del myisam?

    Codice PHP:
    SELECT DISTINCT members.usernamefiles.bigimagemembers_online.logid AS onlinenowmembers_network.datemembers_network.idmembers.id AS uidmembers_network.to_uidmembers_network.uid AS myidmembers_network.commentsmembers_network.approved,
                            
    files.type,     files.approved AS fileapprove,  files.aid,      album.cat,      album.allow_a,  album.allow_n,  album.allow_h,  album.allow_f
                            FROM members_network
                            LEFT JOIN members ON 
    members.id members_network.to_uid OR  members.id members_network.uid )
                            
    LEFT JOIN members_online ON members_online.logid members.id )
                            
    LEFT JOIN files ON files.uid members.id)
                            
    LEFT JOIN album ON album.aid files.aid )
                            
    WHERE (members_network.uid='8183' OR members_network.to_uid='8183') AND members.username != ( 'zeus75' ) AND members_network.type= ( '2' )   AND members_network.approved='yes'  GROUP BY members.id ORDER BY members.lastlogin LIMIT 6

  2. #2
    non credo sia un caso ma convertendo le 5 tabelle interessate in Innodb adesso sembra il 50% più veloce la query

  3. #3
    innodb è generalmente più veloce ma va anche gestito con più attenzione, per quanto riguarda la query invece

    codice:
    SELECT DISTINCT
        members.username,
        files.bigimage,
        members_online.logid AS onlinenow,
        members_network.date,
        members_network.id,
        members.id AS uid,
        members_network.to_uid,
        members_network.uid AS myid,
        members_network.comments,
        members_network.approved, 
        files.type,
        files.approved AS fileapprove,
        files.aid,
        album.cat,
        album.allow_a,
        album.allow_n,
        album.allow_h,
        album.allow_f 
    
    FROM
        members_network 
        LEFT JOIN members ON ( members.id = members_network.to_uid OR  members.id = members_network.uid ) 
        LEFT JOIN members_online ON ( members_online.logid = members.id ) 
        LEFT JOIN files ON ( files.uid = members.id) 
        LEFT JOIN album ON ( album.aid = files.aid ) 
    
    WHERE
        (
            members_network.uid='8183'
            OR
            members_network.to_uid='8183'
        )
        AND
        members.username != ( 'zeus75' )
        AND
        members_network.type= ( '2' )
        AND
        members_network.approved='yes'
    
    GROUP BY
        members.id
    
    ORDER BY
        members.lastlogin
    
    LIMIT
        6
    senza avere la struttura del database, cosa ci sta dentro e per cosa è stato strutturato è al quanto difficile darti una mano anche perché hai una condizione di questo tipo members.id = members_network.to_uid OR members.id = members_network.uid che anche se intuisco a che serve non mi fa capire esattamente che fa la query.
    Inoltre hai un sacco di left join ma dai per scontato che ci siano tutti i vari campi che associ ... perché non metti le inner join cosi fai fare meno lavoro a mysql?

  4. #4
    la query è tratta a un'applicazione sotto licenza che ho acquistato, in pratica con quesa query lo script raccoglie tutte le informazioni necessarie alla realizzazine della pagina profilo personale di un utente: dalle foto personali e album, alla lista degli amici (members_networ appunto) e se l'utente è online oppure no in quel momento

  5. #5
    dici che con l'inner al posto del left potrebbe velocizzarsi?

  6. #6
    può essere, ma non si può darlo per certo ^^

    riguardo al fatto che la query è lenta, la cosa è probabilmente dovuta anche ai dati su cui opera, sulla struttura delle tabelle e via dicendo ... variare i parametri di my.cnf non penso ti porterà grande beneficio in termini di tempo

  7. #7
    solitamente leggo in giro che quando non si utilizzano indici FULLTEXT Conviene sempre utilizzare innodb come motore al posto di myisam .... è corretto il ragionamento?

  8. #8
    TUTTO dipende da come è scritto e come funziona l'applicativo, ma in generale una query che perde tutto questo tempo lo perde perché ha problemi lei

    puoi fare dei test, magari migliora, però cosi applichi una cura all'effetto del problema non alla causa

  9. #9
    facciamo un esempio, se escludo la tabella FILES dal JOIN E poi faccio una seconda query SELECT semplice??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.