Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [MySQL] Limite al join

  1. #1

    [MySQL] Limite al join

    Salve a tutti, qualche tempo fa mi sono ritrovato ad avere un problema un po' fastidioso, problema che sarei curioso di sapere se risolvibile con metodi "meno alternativi".

    Praticamente mi serviva fare un join fra tre tabelle (in realtà erano 2+1 copia), cosa che ho fatto senza problemi se non fosse che le tabelle interessate erano abbastanza pesantucce, di conseguenza ogni volta che lanciavo quella query il database mi salutava per un quarto d'ora buono

    Ovviamente ho risolto spezzettando la query in varie parti, in modo da non dover moltiplicare in una sola volta qualche decina di migliaia di righe. Ma mi chiedevo.. esiste un'istruzione capace di limitare i prodotti senza dover frammentare la query? Ovviamente non parlo della LIMIT, quella limita i risultati.. nel mio caso il db va in crash ancora prima di elaborarli tutti i risultati!

    Mi affido a voi, sicuramente più esperti di me
    <<Errare è umano, ma per incasinare veramente tutto ci vuole un computer!>>

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    è una richiesta un pò generica.. quando i dati diventano troppi bisogna cominciare a rivalutare aspetti che magari si sono tralasciati in fase iniziale di progetto
    - le tabelle sono ben fatte (forma normale ecc)
    - la join è ben fatta, o magari fai delle select * che sono inutili
    - occhio anche a situazione del tipo SELECT ... JOIN tabella ON (condizione) piuttosto che SELECT ... JOIN TABELLA WHERE condizione.. le 2 query sono molto diverse.
    - i dati sono ridondanti tra le tabelle?
    - hai definito opportunamente degli indici?
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    Ovviamente parlo di tabelle che sono pesanti ma con i giusti dati, quindi ridondanza ridotta al minimo, associazioni, integrità, indici e tutto il resto configurati "quasi" decentemente.

    Cerco di spiegarmi meglio con un esempio concreto, degli MP in una chat:

    utenti(ID,Nome)
    chat(IDMex,Testo,Data,ID_Mittente,ID_Destinatario)

    R1: Se ID_Destinatario è NULL il messaggio sarà visibile a tutti quanti


    Supponendo che ID,IDMex siano chiavi primarie, ID_Mittente,ID_Destinatario siano chiavi esterne della tabella utenti, ed io volessi implementare questo:
    -Dato in input il nome di un utente visualizzare tutti i messaggi privati inviati e ricevuti presenti in archivio.

    Il metodo "in due parti" sarebbe semplicissimo da applicare:
    SELECT ID FROM utenti WHERE Nome='Giovanni' -> salvo il risultato in $var
    SELECT * FROM chat WHERE (ID_Mittente=$var AND ID_Destinatario!=NULL) OR ID_Destinatario=$var

    Ma volendolo fare in una sola query esce qualcosa di ben più complesso fuori, perché devo ricorrere a diversi JOIN. Se ci aggiungiamo che gli utenti sono 25.000 ed il numero di messaggi della chat è oltremodo elevato.. capirai perché ho chiesto se esiste qualcosa che permetta di limitare le moltiplicazioni effettuate senza frammentare la query.
    <<Errare è umano, ma per incasinare veramente tutto ci vuole un computer!>>

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.