• User

    Ottimizzazione di uno script: alcune query

    Salve a tutti,
    Sto lavorando ad uno script php che dovrà aggiornare un database di prodotti.
    Così com'é adesso, a processare un file contenente una serie di prodotti mi impiega circa 37 secondi.
    In produzione dovrà processarne intorno al centinaio o anche più, quindi si tratta di un tempo inaccettabile.

    Ci sono due task, compiuti da questo file, a cui imputerei lo spreco di tempo.
    Si tratta dell'inserimento delle categorie e del collegamento dei prodotti alle categorie.

    Mi spiego: la struttura del db è, semplificando, questa:

    prodotti(id, dati prodotto...)
    categorie(id, nome)
    collegamenti(prodotto, categoria)

    E' chiaro che ogni prodotto può appartenere a diverse categorie.

    Ora, due task vengono effettuati da php con l'ausilio di più query:

    • L'inserimento di una categoria nel database: lo script controlla con una SELECT se la categoria esiste già, e se non esiste la crea con una INSERT.
      Come posso far si che il controllo sull'esistenza avvenga direttamente nella query di INSERT?

    • Il collegamento: per ogni categoria del prodotto viene fatta una SELECT per ottenerne l'ID (ne abbiamo infatti il nome) e una INSERT per inserire il collegamento.
      Come posso far si che la INSERT ottenga direttamente da sola l'ID della categoria?

    Non ho poi molta dimistichezza con l'SQL diciamo più che basilare. :bho:

    Grazie in anticipo ^^


  • User Attivo

    **Come posso far si che il controllo sull'esistenza avvenga direttamente nella query di INSERT?
    **Penso che potresti farlo assegnando al campo interessato, direttamente nel DATABASE, la chiave UNICA in modo che se venisse inserito un dato uguale il DATABASE lo rifiuta.

    **Come posso far si che la INSERT ottenga direttamente da sola l'ID della categoria?
    **In questo caso credo non ci sia niente da fare, se non controllando bene come funzionano le LEFT JOIN, anche se credo servano solo per la selezione di dati da più tabelle con una sola query


  • User

    @mikslap said:

    **Come posso far si che il controllo sull'esistenza avvenga direttamente nella query di INSERT?
    **Penso che potresti farlo assegnando al campo interessato, direttamente nel DATABASE, la chiave UNICA in modo che se venisse inserito un dato uguale il DATABASE lo rifiuta.Mmh, si hai ragione!
    @mikslap said:
    **Come posso far si che la INSERT ottenga direttamente da sola l'ID della categoria?
    **In questo caso credo non ci sia niente da fare, se non controllando bene come funzionano le LEFT JOIN, anche se credo servano solo per la selezione di dati da più tabelle con una sola queryPossibile non si possa fare con una subquery?


  • User Attivo

    Le **subquery **selezionano solamente.
    Credo !!!!!!!!!!!!!


  • User

    Infatti, usando una subquery SELECT che seleziona l'id all'interno di una INSERT funziona perfettamente.. 😄


  • User Attivo

    [..]
    Si il tutto va a buon fine.
    Ma alla fine dei conti ti ritrovi con i tempi di selezione o non cambia niente.


  • User

    Guadagno un secondo in media, sempre assurdamente poco.
    Farò un profiling dello script per capire dov'é che rallenta tanto.