• User Newbie

    Ottimizzazione MySQL query NOT IN

    Ciao a tutti,
    sto tentando di estrarre dei dati da una tabella del mio db a diverse condizioni e in cui finora non mi ero mai cimentata.

    SELECT * FROM audio 
    WHERE NOW() BETWEEN audio_dataInizio AND audio_dataFine 
    AND clienti_id = 100 
    AND filiali_id = 500 
    AND audio_attivo = 1 
    AND FIND_IN_SET('2', audio_attivo_for_radio) <> 0 
    AND audio_id NOT IN ( SELECT audio_id FROM storico WHERE clienti_id=100 AND filiali_id = 500 AND audio_id!=0) 
    UNION ALL 
    SELECT * FROM audio 
    WHERE NOW() BETWEEN audio_dataInizio AND audio_dataFine 
    AND clienti_id = 100 
    AND audio_attivo = 1 
    AND audio_id!=0 
    AND NOT EXISTS ( SELECT * FROM audio 
    WHERE NOW() BETWEEN audio_dataInizio AND audio_dataFine 
    AND clienti_id = 100 
    AND filiali_id = 500 
    AND audio_attivo = 1 
    AND audio_id!=0 
    AND FIND_IN_SET('2', audio_attivo_for_radio) <> 0 
    AND audio_id NOT IN ( SELECT audio_id FROM storico WHERE clienti_id=100 AND audio_id!=0) 
    ) 
    AND audio_id IN (SELECT audio_id FROM storico WHERE clienti_id=100 AND filiali_id=500 ORDER BY storico_data ASC) 
    ORDER BY RAND() LIMIT 1 
    

    La query che ho riportato deve estrarre il nome di un file audio associato

    • al cliente_id 100,
    • alla filiale_id 500,
    • deve essere abilitato,
    • deve essere attivo per suonare sul canale numero 2
    • lo stesso file NON deve essere presente nella tabella STORICO se associato allo stesso cliente e filiale per non creare una ripetizione della stessa musica ma, (essendo questa query ripetuta in un ciclo) qualora sia impossibile rispettare questa condizione, la query dovrà comunque restituirlo onde evitare un risultato nullo con la conseguenza di un mancato ascolto.

    Questa query funziona ma risulta lenta.
    Esiste un modo alternativo che esaudisca comunque ciò che voglio fare?
    Grazie a tutti in anticipo


  • User Attivo

    Ciao MarikaFreg e benvenuta nel ForumGT

    Hai inserito gli indici nella tua tabella?


  • Moderatore

    Ciao MarikaFreg, ciao Pietro. :smile5:
    Faccio un'ipotesi: una fetta del problema sta nel ORDER BY RAND. Cosa ne pensate?
    Altra questione, forse di minore importanza rispetto al rand: se non ho preso un abbaglio, la SELECT dopo UNION ALL parte anche quando non serve.


  • User Attivo

    non hai preso un abbaglio per nessuna delle due ipotesi..un' ottimizzazione anche in quel senso aumenterebbe le performance