Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di quincy
    Registrato dal
    Aug 2003
    Messaggi
    247

    [SQL]Ottimizzazione query

    Salve a tutti,
    ho il seguente problema.

    Ho creato una tabella che contiene i seguenti campi:|id|idArticolo|idSettore|data|...... ed altri.
    Ho creato degli indici su idArticolo,idSettore,data, perchè sono quelli che finiscono nelle query di tipo select per il recupero dei dati.

    Questa tabella ha molti record(che tendonoa crescere), dal momento che in essa confluiscono appunto tutti gli articoli,di un certo settore, in una certa data,con tutte le info su questi.

    Il mio primo problema è quello che recuperare articoli in un certo range di un certo settore impiega molto tempo: come potrei fare per velocizzare la query?
    Ad esempio se faccio:
    SELECT * FROM articoli WHERE settore='calcio' and idArticolo='11' and data>'2008-01-01 21:02:28' and timestamp<='2008-02-09 04:23:17' ORDER BY timestamp ASC

    è una query decisamente lenta.


    Ora se io volessi recuperare l'ultimo articolo venduto per un settore, nel modo più veloce possibile come potrei fare?
    select * from articoli where data=(select max(data) from articoli where idArticolo = '11' and settore = 'calcio') and idArticolo = '11' è la migliore soluzione che ho trovato, ma anche questa è una query lentina.

    Pensare a creare tante tabelle divise per articoli potrebbe essere una soluzione ottimale?


    Grazie per l'aiuto che potrete darmi.

    Saluti

    Andrea
    Andrea

  2. #2

  3. #3
    Utente di HTML.it L'avatar di quincy
    Registrato dal
    Aug 2003
    Messaggi
    247
    Ciao gaetano123.

    Grazie della risposta, ma non ho capito come potrebbe esseremi utile.

    Saluti
    Andrea

  4. #4
    Crei le pagine php e vedi se è veloce, funziona pure se è dimostrativo.

  5. #5

    Re: [SQL]Ottimizzazione query

    Originariamente inviato da quincy
    |id|idArticolo|idSettore|data|...
    indici su idArticolo,idSettore,data
    [...]
    in essa confluiscono appunto tutti gli articoli,di un certo settore, in una certa data,con tutte le info su questi.
    [...]
    SELECT * FROM articoli WHERE settore='calcio' and idArticolo='11' and data>'2008-01-01 21:02:28' and timestamp<='2008-02-09 04:23:17' ORDER BY timestamp ASC

    è una query decisamente lenta.
    [...]
    Io non ho capito come è impostata la tabella e a che serve.
    - perché hai due colonne che sarebbero naturali candidate ad essere chiave primaria: id e idArticolo?
    - perché cerchi sia per idArticolo che per settore? Ogni idArticolo si suppone unico;
    - perché cerchi per idArticolo e range di date?
    - perché hai una colonna indicizzata, idSettore, ma la ricerca la fai su settore?

    Potresti eseguire questa query:
    SHOW CREATE TABLE articoli
    e riportarci qui il risultato?
    Qualunque imbecille può inventare e imporre tasse. (Maffeo Pantaleoni)

  6. #6
    Utente di HTML.it L'avatar di quincy
    Registrato dal
    Aug 2003
    Messaggi
    247
    ciao webus, grazie per la risposta.


    La tabella che ho creato io, in realtà non fà lo storage di articoli, ma di misure biologiche, ma il punto non cambia e parlare di ph,redox,etc non mi sembrava il caso .

    Ho una tabella contenente non tanti ariticoli diversi,ma una sorta di storico di tutti gli articoli.

    Quindi in questa tabella finiscono appunto degli ariticoli(idArticolo) che hanno delle caratteristiche(settore) ed una data di inserimento(data),e la tabella serve per realizzare una tracciabilità di tutti i cambiamenti fatti per l'articolo stesso.Quindi nella tabella potrei avere centinaia di record a nome di un idArticolo con data diversa e relativi dati diversi per capirci. Infatti mi sto convincendo che per ottimizzare la query, dovrò creare tabelle separate per ogni articolo,e qui riportare lo storico delle evoluzioni dello stesso per velocizzare le mie query.Quindi quando si aggiungerà un nuovo articolo, dovrò sempre creare una nuova tabella.

    Grazie comunque per la tua risposta.

    Saluti

    Andrea
    Andrea

  7. #7
    Originariamente inviato da quincy
    La tabella che ho creato io, in realtà non fà lo storage di articoli, ma di misure biologiche, ma il punto non cambia e parlare di ph,redox,etc non mi sembrava il caso .

    Ho una tabella contenente non tanti ariticoli diversi,ma una sorta di storico di tutti gli articoli.
    Quindi in questa tabella finiscono appunto degli ariticoli(idArticolo) che hanno delle caratteristiche(settore) ed una data di inserimento(data),e la tabella serve per realizzare una tracciabilità di tutti i cambiamenti fatti per l'articolo stesso.Quindi nella tabella potrei avere centinaia di record a nome di un idArticolo con data diversa e relativi dati diversi per capirci. Infatti mi sto convincendo che per ottimizzare la query, dovrò creare tabelle separate per ogni articolo,e qui riportare lo storico delle evoluzioni dello stesso per velocizzare le mie query.Quindi quando si aggiungerà un nuovo articolo, dovrò sempre creare una nuova tabella.
    quincy, la soluzione che stai pensando è una cura peggiore del male. È come se per ogni articolo nuovo dovessi aggiungere anche una nuova tabella per il suo prezzo.
    Qualunque imbecille può inventare e imporre tasse. (Maffeo Pantaleoni)

  8. #8
    Utente di HTML.it L'avatar di quincy
    Registrato dal
    Aug 2003
    Messaggi
    247
    Ho provato ad inserire anche indici compositi sui campi che uso nella clausola where della query di selezione, ho usato explain del mysql per rendermi conto se il server usasse l'indice giusto, ma la velocità non cambia di molto(però migliora).


    quincy, la soluzione che stai pensando è una cura peggiore del male. È come se per ogni articolo nuovo dovessi aggiungere anche una nuova tabella per il suo prezzo.
    quello che dici è vero , ma tornado al mio problema reale(ossia storage di grandezze biologiche), le tabelle che verrebbero create non sarebbero tantissime.

    Altra soluzione non la vedo per massimizzare le performance delle query di recupero dati.


    Grazie della risposta

    Saluti
    Andrea

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.