Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 42
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    2,460

    [MySql] velocizzare una select

    Avendo a che fare con una tabella molto grossa (milioni di righe) come si può fare per velocizzare una select ?

    La tabella è semplicissima:
    campo1 - campo2

    la query:
    select campo2 from tabella where campo1='xxx' order by rand() limit 0,1

    Attualmente impiega 2 minuti ad estrapolare un singolo record..
    qualche idea ?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    2,460
    Nessuno ha idea ? :P

  3. #3
    Originariamente inviato da uMoR
    Nessuno ha idea ? :P
    random per random prova a mettere

    LIMIT 1 invece di LIMIT 0, 1

    in alcuni casi. ma al volo non ricordo quali, si stoppa la ricerca appena la condizione richiesta viene soddisfatta. Controlla sul manuale, ricordo che viene spiegato quando e come.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4

    Re: [MySql] velocizzare una select

    Originariamente inviato da uMoR
    qualche idea ?
    Sul campo1 esiste un indice?
    Se non c'è, può essere ragionevole mettercelo, velocizzi la select a scapito delle modifiche.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    2,460
    no non c'è un indice, ma in questo caso serve visto che faccio una ricerca sulla parola ?

  6. #6
    Originariamente inviato da uMoR
    no non c'è un indice, ma in questo caso serve visto che faccio una ricerca sulla parola ?
    Sì, potrebbe velocizzarti di molto la ricerca.

    Come dicevo, ti rallenta un po' in fase di update e insert (perché va aggiornato anche l'indice, ovvio), e soprattutto aggiungere l'indice ora a una tabella con milioni di record sarà un'operazione pesantuccia assai
    In ogni modo è assai probabile che tu ne tragga un sensibile vantaggio nella select.

    Al limite fai una prova su una tabella più piccola. Copia tipo 200 mila record su una tabella provvisoria e fai dei test, con e senza indice, verificando le differenze di velocità.

  7. #7
    prova l'esempio che trovi sul manuale mysql...
    codice:
    LOCK TABLES foo READ;
    SELECT FLOOR(RAND() * COUNT(*)) AS rand_row FROM foo;
    SELECT * FROM foo LIMIT $rand_row, 1;
    UNLOCK TABLES;
    estrai rand_row e lo rilanci nel LIMIT della query successiva.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Originariamente inviato da piero.mac
    prova l'esempio che trovi sul manuale mysql...
    codice:
    LOCK TABLES foo READ;
    SELECT FLOOR(RAND() * COUNT(*)) AS rand_row FROM foo;
    SELECT * FROM foo LIMIT $rand_row, 1;
    UNLOCK TABLES;
    estrai rand_row e lo rilanci nel LIMIT della query successiva.
    Volendo si può fare anche con le "variabili SQL", visto che tanto il valore rand_row non gli serve come dato finale ma è solo un dato intermedio di lavoro, giusto?

  9. #9
    Originariamente inviato da skidx
    Volendo si può fare anche con le "variabili SQL", visto che tanto il valore rand_row non gli serve come dato finale è solo un dato intermedio di lavoro, giusto?
    Giusto, ma non credo si possano usare le variabili nel LIMIT... almeno non nella 4.0 ... bisognerebbe provare con le nuove versioni 5.0.x

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    2,460
    avevo già provato questa soluzione ma è lenta lo stesso.. per intederci:

    +----------+
    | rand_row |
    +----------+
    | 40828799 |
    +----------+
    1 row in set (57.07 sec)

    Aggiungendo una WHERE impiega:
    1 row in set (1 min 2.17 sec)

    Improponibile..

    Comunque, se potesse aiutare, il server MySql è un AMD Athlon Xp 2000+ con 1gb di ddram 400mhz, disco da 80gb 7200rpm.. fra poco in raid 0.

    La versione di MySql:
    4.1.11-Debian_4sarge2-log

    Non so su cosa intervenire.. anche perchè non posso splittare la tabella..

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.