Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Velocizzare Query/Loop

  1. #1

    Velocizzare Query/Loop

    Salve,
    ho questo script che va a recuperare dati da circa 900 prodotti, il caricamento è già abbastanza lento, infatti impiega 6-7 secondi ogni volta e mi chiedevo come impostereste voi le query o il loop per velocizzare la cosa considerando che i prodotti saranno sempre di più..!
    codice:
    
                              <?php
                                $data = $mysqli->query("SELECT * FROM prodotti");
                                foreach($data as $row){
                                $marca = $mysqli->query("SELECT marca FROM marche WHERE id = " . $row['idMarca']);
                                $marca = mysqli_fetch_assoc($marca);
                                $marca = $marca['marca'];
                                    
                                    echo "<p style='float: left; padding: 0 50px 20px 0;'>
                                    <label style='cursor: pointer'><input type='checkbox' name='prodotti[]' id='" . $row['id'] . "' value='" . $row['id'] . "' class='flat'/> $marca " . $row['nome'];
                                    if($row['nicotina'] != 'NO'){
                                        echo ' - Nico: '  . $row['nicotina'];
                                    }
                                    echo "</label></p>";
                                }
                              ?>

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    select * from prodotti
    inner join marche on idmarca = id

    nella clausole select metti i campi che ti inetressano.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Beh ci sono alcune cose che puoi fare, io userei i prepared statements con pdo che probabilmente ti potrebbero aiutare, metterei il prepare() ed il bindParam() fuori dal foreach, bindParam() passa la variabile per riferimento, quindi puoi semplicemente aggiornare la variabile in ogni foreach e dovrebbe funzionare tutto, con qualche miglioramento di performance.

    In ogni caso 9 secondi per 900 prodotti mi sembrano tanti, potrebbe dipendere anche dal server che � poco performante.

    In molti casi si verificano problemi perch�l'applicazione non � ottimizzata a livello logico, dovresti chiederti se � possibile ottimizzarne il funzionamento per migliorarne la velocit� (quello che ti ha suggerito badaze � un chiaro esempio).
    Ultima modifica di M4V1; 15-01-2017 a 13:39

  4. #4
    Quote Originariamente inviata da badaze Visualizza il messaggio
    select * from prodotti
    inner join marche on idmarca = id

    nella clausole select metti i campi che ti inetressano.
    Buona idea.. Ma come faccio? Perchè l'id lo conosco solo dopo averlo estratto dalla tabella prodotti!

  5. #5
    Quote Originariamente inviata da M4V1 Visualizza il messaggio
    Beh ci sono alcune cose che puoi fare, io userei i prepared statements con pdo che probabilmente ti potrebbero aiutare, metterei il prepare() ed il bindParam() fuori dal foreach, bindParam() passa la variabile per riferimento, quindi puoi semplicemente aggiornare la variabile in ogni foreach e dovrebbe funzionare tutto, con qualche miglioramento di performance.

    In ogni caso 9 secondi per 900 prodotti mi sembrano tanti, potrebbe dipendere anche dal server che � poco performante.

    In molti casi si verificano problemi perch�l'applicazione non � ottimizzata a livello logico, dovresti chiederti se � possibile ottimizzarne il funzionamento per migliorarne la velocit� (quello che ti ha suggerito badaze � un chiaro esempio).
    Credimi.. Non c'ho capito nulla! xD
    Cmnq il server non sarà dei migliori, però le altre pagine sono abbastanza veloci

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Quote Originariamente inviata da Luigi636 Visualizza il messaggio
    Buona idea.. Ma come faccio? Perchè l'id lo conosco solo dopo averlo estratto dalla tabella prodotti!
    Prova con phpmyadmin e capirai.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Prova con phpmyadmin e capirai.
    Ho capito come fare.. L'avevo utilizzato in passato.. Ho fatto così:
    codice:
    select * from prodotti
    inner join marche on idmarca = prodotti.idMarca
    Tuttavia così facendo va più lento di prima.. Anzi, si blocca proprio la pagina!
    Ultima modifica di Luigi636; 16-01-2017 a 01:45

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Come dice M4V1 son strane queste performance per 900 record. Sicuro che non ci sia altro che rallenti lo script? Se no io sentirei chi gestisce il database.

    In alternativa potresti pensare a un sistema si cache che dovrebbe mitigare il problema.
    Una cosa banale sarebbe:

    Codice PHP:
    if(file_exists('/cache/prodotti')){
       include 
    '/cache/prodotti';
    }else{
       
    ob_start();
       
       
    // il tuo codice html/php + query

       
    $data ob_get_clean();
       
    file_put_contents('/cache/prodotti_tmp'$data);
       
    rename('/cache/prodotti_tmp''/cache/prodotti');

    Infine, quando vai a modificare il database devi cancellare il file di cache in modo che la prossima volta viene ricreato.

    Se il tuo sito è molto frequentato, invece, usa una libreria di cache già fatta

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    O
    Quote Originariamente inviata da Luigi636 Visualizza il messaggio
    Ho capito come fare.. L'avevo utilizzato in passato.. Ho fatto così:
    codice:
    select * from prodotti
    inner join marche on idmarca = prodotti.idMarca
    Tuttavia così facendo va più lento di prima.. Anzi, si blocca proprio la pagina!
    Dovrebbe essere più veloce. Quanti record hai in tutto ?
    Di più dovresti fare delle pagine come sul forum per visualizzare una parte dei record in ogni pagina.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    No a me servono tutti d'un botto.. Comunque sono 888 attualmente.. E il sito non è frequentato perchè si tratta di un gestionale interno..

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 © 2024 vBulletin Solutions, Inc. All rights reserved.