Ho due tabelle, una rappresenta l'accesso ad un sito, la sessione per capirci, e c'è una colonna "utente" che identifica l'ID utente, l'altra rappresenta le pagine visitate dall'utente internamente ad ogni singola sessione. La tabella "pagine_visitate" è legata alla tabella "sessioni" da una chiave esterna.
Quando vado a fare il count di tutte le visite fatte da un utente, quindi non le sessioni, ma il count delle pagine visitate per tutte le sessioni a lui riferite, i tempi della query è circa 40 secondi...Sto cercando di ottimizzarla ma non ne vengo fuori. La query è questa:
la chiave accessi.sessione_id è un indice, così come sessioni.user_id ovviamente. Ho fatto un EXPLAIN, praticamente mysql prima seleziona tutte le sessioni applicando la WHERE SIMPLE e nel caso di alcuni utenti vengono fuori 3 mln di record, poi procede con la JOIN, ma i tempi sono enormi! Ho provato a cambiare la query così sperando di ottenere risultati diversi:Codice PHP:SELECT COUNT(*) as visite FROM accessi LEFT JOIN sessioni ON accessi.sessione_id=sessioni.id WHERE sessioni.user_id='6'
Codice PHP:SELECT COUNT(*) as visite FROM accessi WHERE sessione_id IN ( SELECT id FROM sessioni WHERE user_id='6');
Pensavo che così facendo ci metteva un attimo a scremare la SELECT annidata con la sola WHERE, ed infatti fa abbastanza subito se testo quella sola query con un LIMIT, ma se non uso il LIMIT e faccio tirare giù tutti i 3milioni di risultati per poi a incrociare 3 milioni di istanze con la causola IN...è comunque un bagno di sangue. Secondo voi c'è modo di ottimizzare una query del genere?

Rispondi quotando
