Visualizzazione risultati 1 fino 12 di 12

Discussione: Selezionare più righe con una query [era: mysql query...]

  1. #1
    Guest

    Predefinito Selezionare più righe con una query [era: mysql query...]

    Ciao Ragazzi, ho un paio di domande da sottoporvi, sicuramente un po' niubbe.

    1- E' possibile selezionare con una query più di una riga?

    Nel senso: se io faccio un select "WHERE A= 1" il database mi risponde solo con la prima riga che trova che corrisponde, almeno credo.
    Perchè se gli chiedo $row[1][0] mi scompone il dato, io pensavo mi desse una tabella di array a due dimensioni, [riga][colonna]...

    Come posso fare?


    2- Da che cosa dipende la velocità del database a parte l'efficienza del programma? Intendo dire che se uno aumento il "traffico" sul pannello di altervista aumenta anche la velocità di risposta se magari ci sono 100 utenti che chiedono contemporaneamente la pagina?
    Non credo!
    Che cosa posso fare (anche fuori altervista) se volessi che una pagina che mysql mi elabora in 0,02 secondi invece mi elabori in 0,01? E' giusto per curiosità per aumentare la velocità di ricezione della pagina da parte dell'utente.

  2. #2
    Guest

    Predefinito

    1
    poi fare così
    Codice PHP:
    $dati= mysql_query("select * from tabella WHERE A= 1");
    while(
    $array = mysql_fetch_array($dati))
    {
    //funzione da ciclare esempio
    print ("$array[campo_tabella]");
    }
    2
    per la velocità non puoi fare niente. La banda indica solo il traffico totale mensile che può generare il sito.
    L'unica cosa che puoi fare è ottimizzare i tuoi script di modo che facciano il minor numero di querys.

  3. #3
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da Zabuza Visualizza messaggio
    1- E' possibile selezionare con una query più di una riga?

    Nel senso: se io faccio un select "WHERE A= 1" il database mi risponde solo con la prima riga che trova che corrisponde, almeno credo.
    Perchè se gli chiedo $row[1][0] mi scompone il dato, io pensavo mi desse una tabella di array a due dimensioni, [riga][colonna]...

    Come posso fare?
    Dipende da come scrivi le condizioni di selezione (la clausola WHERE). Nel tuo caso, se A fosse una chiave primaria (per definizione a valori unici), la query estrarrà un solo record. Puoi anche costruire condizioni composte che permettano di estrarre più record, o anche nessuno. Per esaminarli tutti, va bene (o quasi) il ciclo suggerito da vivalataverna (qui di seguito completato e corretto):
    Codice:
    $query = "SELECT * FROM Tabella WHERE ...";
    $result = mysql_query ($query, $db);
    while ($line = mysql_fetch_array ($result))
    {
       // elabori i valori di ogni record scrivendo $line['nome_campo'];
    }
    Citazione Originalmente inviato da Zabuza Visualizza messaggio
    2- Da che cosa dipende la velocità del database a parte l'efficienza del programma? Intendo dire che se uno aumento il "traffico" sul pannello di altervista aumenta anche la velocità di risposta se magari ci sono 100 utenti che chiedono contemporaneamente la pagina?
    Non credo!
    Che cosa posso fare (anche fuori altervista) se volessi che una pagina che mysql mi elabora in 0,02 secondi invece mi elabori in 0,01? E' giusto per curiosità per aumentare la velocità di ricezione della pagina da parte dell'utente.
    Non c'è una risposta unica, il concetto base è quello di memorizzare nel database alcune ridondanze, ovvero dati che possono essere calcolati più o meno facilmente da altri: la regola è che un accesso diretto ad un dato è più veloce di un calcolo.

    Dato che così è parecchio campata in aria, ecco un esempio: considera questo forum in cui vicino ad ogni utente, è riportato il numero di messaggi che ha inviato. Se non ci fossero ridondanze, per conoscere quel numero bisognerebbe ad ogni chiamata di pagina andare a cercare tutti i messaggi postati, raggrupparli per utente, contare quanti messaggi ci sono in un gruppo e visualizzare il risultato. Se invece si memorizza un campo ridondante tipo "conteggio_messaggi", ecco che puoi ottenere questo dato per accesso diretto (in modo molto più veloce)... lo svantaggio è che ad ogni inserimento/eliminazione di un messaggio, bisogna aggiornare in parallelo il contatore...

    Spero di averti risposto... stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  4. #4
    Guest

    Predefinito

    Poi per ottimizzare un database bisogna anche impostare correttamente gli indici. Ad esempio, se cerchi con una query "where a=1" e non è impostato un indice su a, il DBMS dovrà leggere tutta la tabella per trovare tutti i record con a=1. Se invece su a è impostato un indice, il DBMS potrà trovare rapidamente i record partendo dall'indice.

    Però mantenere un indice costa: oltre ad occupare spazio, ogni volta che si effettua una modifica sui dati l'indice andrà aggiornato; quindi se i tempi di ricerca si riducono i tempi di inserimento/modifica aumentano: bisognerà valutare se i maggiori tempi di inserimento sono compensati dai minori tempi di ricerca. Gli indici sono utili soprattutto in tabelle molto grandi, nei campi su cui vengono effettuate ricerche (o richieste di ordinamento per quel valore) frequentemente, possibilmente in tabelle aggiornate raramente.

    Questo è solo un accenno del problema: ci sono esami universitari in cui questo è uno degli argomenti principali, e c'è gente che ottimizza database per mestiere e prende svariati €$€$
    Ultima modifica di stasera : 26-02-2008 alle ore 00.15.03

  5. #5
    Guest

    Predefinito

    Grazie mille raga mi siete stati strautili!

    Però avrei un altro dubbio.

    Praticamente mettiamo che io debba fare un sistema tipo il forum. In cui viene fuori una lista con i topic ordinati dai più recenti ai più vecchi. (con i post che li fanno diventare recenti come i forum)

    Ecco però non mi viene in mente un buon metodo per ordinarli che non sia distruttivo per la velocità del sito!

    I forum normali come li fanno?

  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

    Praticamente mettiamo che io debba fare un sistema tipo il forum. In cui viene fuori una lista con i topic ordinati dai più recenti ai più vecchi. (con i post che li fanno diventare recenti come i forum)
    Una buona strategia è quella di memorizzare la data dell'ultimo post nella tabella dei topic. In questo modo per ordinare i topic non devi accedere ai post con un risparmio notevole di carico.

    Un'ottimizzazione potrebbe essere l'uso di un indice ordinato sul campo di cui sopra. Lo svantaggio sta nel fatto che essendo una tabella che viene comunque modificata spesso si rischia di perdere più tempo nella gestione dell'indice di quello risparmiato in fase di lettura.

    Un consiglio potrebbe essere quello di installare un forum opensource esistente e dare un'occhiata a tabelle e indici per prendere qualche spunto.


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


  7. #7
    Guest

    Predefinito

    il problema è proprio che se ogni volta devo andare a controllare la data sul topic perdo un sacco di tempo!

    Idem se faccio un indice separato con: Id | Id_Topic
    e poi ordino quando mi postano, però mi sembra una cosa luuuuuuuunga...

    Non ci sono metodi più veloci?

  8. #8
    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 Zabuza Visualizza messaggio
    il problema è proprio che se ogni volta devo andare a controllare la data sul topic perdo un sacco di tempo!
    Ma come fai a ordinare secondo un criterio se questo criterio non vuoi leggerlo?

    Dovresti tenerti un elenco ordinato di topic, ma senza un criterio non puoi avere una cosa del genere in un DB.

    Poi, scusa, perché perdi tempo? Sarebbe una query del tipo:

    Codice:
    SELECT topic.id_topic, topic.titolo_topic FROM topic ORDER BY topic.last_post_timestamp DESC
    Idem se faccio un indice separato con: Id | Id_Topic
    e poi ordino quando mi postano, però mi sembra una cosa luuuuuuuunga...

    Non ci sono metodi più veloci?
    Purtroppo ci sono due azioni che hanno bisogno di ottimizzazioni che contrastano e bisogna trovare un compromesso:
    - In fase di inserimento ogni indice è una perdita di tempo. Se sono indici ordinati peggio ancora.
    - In fase di lettura gli indici ti servono. Se ordinati fai prima a prendere un intervallo e avere i dati già ordinati

    In un DB per un forum si legge moltissimo e si scrive tanto, per cui non c'è tanta storia: indici giusti e dati ridondanti.


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


  9. #9
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Citazione Originalmente inviato da Zabuza Visualizza messaggio
    il problema è proprio che se ogni volta devo andare a controllare la data sul topic perdo un sacco di tempo!

    Idem se faccio un indice separato con: Id | Id_Topic
    e poi ordino quando mi postano, però mi sembra una cosa luuuuuuuunga...

    Non ci sono metodi più veloci?
    Veramente credo che saitfainder intendesse questo:
    - per ogni topic, memorizzi la data dell'ultimo post
    - questa data dovrà essere aggiornata ogni volta che si aggiunge un nuovo post al topic (oppure, si rimuove l'ultimo!)

    A questo punto, puoi ordinare i topic usando dati ottenibili solamente mediante accesso diretto... quindi la complessità dell'operazione è data solo dall'ordinamento. Se non memorizzassi la data come spiegato, potresti ancora fare quello che chiedi, ma dovresti:
    - estrarre tutti i post da tutte le discussioni
    - raggruppare i post per discussione ed estrarre il valore della data più recente
    - ordinare le discussioni sulla base delle date estratte prima
    che è una sequenza decisamente più complicata...

    Sta a te vedere se ti conviene mantenere la ridondanza (in questo caso, se con il raddoppio il numero delle operazioni di aggiornamento resta comunque inferiore alle possibili ricerche) oppure no.

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  10. #10
    Guest

    Predefinito

    SELECT topic.id_topic, topic.titolo_topic FROM topic ORDER BY topic.last_post_timestamp DESC


    :O non sapevo esistesse questo comando!

    ma scusa poi come faccio per esempio a prendere i primi 10?
    Cioè io posso fare una tabella:

    | Id | Id_Topic | Titolo_Topic | Time |

    E poi con questo comando posso ordinare per time più recente.
    Dopodichè prendo gli Id 1,2,3,4,5,6,7,8,9,10 ?

  11. #11
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    In MySQL (attenzione, non funziona con altri DBMS!) puoi usare:
    Codice:
    SELECT topic.id_topic, topic.titolo_topic 
    FROM topic 
    ORDER BY topic.last_post_timestamp DESC
    LIMIT 0, 10
    Puoi estrarre gli altri 10, ricordando che il primo numero sulla clausola LIMIT è l'offset (0 corrisponde al primo record) e il secondo il numero di record.

    Stammi bene...
    Ultima modifica di dementialsite : 28-02-2008 alle ore 15.34.33
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  12. #12
    Guest

    Predefinito

    Grazie mille ora provo se riesco :D

Regole di scrittura

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