- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Ottimizzazione MySQL query NOT IN
-
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
-
Ciao MarikaFreg e benvenuta nel ForumGT
Hai inserito gli indici nella tua tabella?
-
Ciao MarikaFreg, ciao Pietro.
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.
-
non hai preso un abbaglio per nessuna delle due ipotesi..un' ottimizzazione anche in quel senso aumenterebbe le performance