2015-07-23 14 views
6

Questa è più una domanda piuttosto che un problema che devo risolvere. Il mio back-end è veloce e le mie query funzionano alla grande, quindi non è che importante. Va bene, ma arriviamo ad esso.MySQL: come interrogare più "statistiche" in una singola query?

Ho 4 pannelli di statistiche sul mio cruscotto per quanto riguarda il numero di visualizzazioni da oggi, ieri, questa settimana e questo mese; ognuno prende una query nel mio database. Quello che stavo chiedendo è, come si potrebbero mettere insieme tutte queste domande per facilitare il carico sul database/server?

stavo guardando attraverso StackOverflow prima di chiedere e vide uno dicendo qualcosa del tipo:

SUM(case when status = 'open' then 1 else 0 end) as [Open], 
SUM(case when status = 'closed' then 1 else 0 end) as [Closed] 

Fonte: Gathering multiple statistics about a table in a single query

Che potrebbe essere quello che mi serve, potrebbe essere qualcosa di simile:

SUM(case when DATE(created_at) = '2015-07-23' then 1 else 0 end) as today, 
SUM(case when DATE(created_at) = '2015-07-22' then 1 else 0 end) as yesterday, 
SUM(case when WEEK(created_at) = '29' then 1 else 0 end) as week, 
SUM(case when MONTH(created_at) = '7' then 1 else 0 end) as month 

Mi stavo chiedendo se qualcuno ha alcuni migliori suggerimenti, come ho applicato questo al mio f unzione e funziona bene.

+0

Mentre fare questo genere di cose potrebbe aiutare con il carico sul server, potrebbero anche ostacolarlo se le query finiscono per diventare eccessivamente complicate; dipende davvero dai dati necessari e dalla potenza del server. – Uueerdo

+0

È possibile memorizzare nella cache i valori, quindi invalidare la cache quando necessario. Un altro approccio potrebbe essere l'utilizzo di trigger come il trigger e il mantenimento delle misurazioni effettive piuttosto che il loro calcolo. Pro e contro a ciascuno. Ad ogni modo, cambiando lentamente le dimensioni temporali si suggerisce qualcosa che memorizza nella cache quelle a un dato intervallo. – ficuscr

+0

Grazie! Questo ha molto senso. Proverò entrambi gli approcci e forse vedrò come si comportano nel tempo quando ottengo più dati. Cercherò di memorizzarli nella cache, non avrò bisogno di aggiornamenti in tempo reale, quindi potrei anche provare :-) –

risposta

3

I commenti stanno dando buoni spunti. Fornirò qui un'altra idea, che concettualmente è usato nella maggior parte delle banche con cui ho lavorato.

Quando ci sono miliardi di righe e non sono necessarie istantanee istantanee esatte per ogni richiesta (ovvero: si ha una tolleranza per dati leggermente obsoleti), vale la pena esplorare i processi batch.

Questo è come funziona:

  1. si definisce la vostra tolleranza lag: per esempio: "Sono ok con dati obsoleti 8 ore". Questa è la periodicità del processo batch.
  2. Si denormalizza il database per aggiungere una colonna/tabella "ridondante" che memorizza i totali parziali di propria scelta. Ad esempio, si aggiunge una tabella denominata statistics_snapshot con 4 colonne: (timestamp, month, day, week) o qualcosa del genere.
  3. Si crea una stored procedure in mysql che riempie questa tabella con le 4 query o con una query globale come suggerito. Viene registrato anche un timestamp in modo da sapere quando è stato preso.
  4. Si crea un utente con la sovvenzione EXECUTE per tale procedura, SOLO.

    CREATE USER 'cron_mysql_user'@'localhost' IDENTIFIED BY 'strongpassword'; 
    GRANT EXECUTE ON PROCEDURE db_name.proc_name TO 'cron_mysql_user'@'localhost'; 
    
  5. si utilizza DBMS_JOB un job cron per collegare mysql ed eseguire questa procedura con la periodicità di cui al punto # 1. Di solito è possibile eseguire gli script dalla riga di comando in questo modo:

    mysql --user='cron_mysql_user'@'localhost' -pstrongpassword --execute="call proc_name()" db_name 
    
  6. Si crea piacevoli relazioni, sulla base di snapshot periodiche :-)

Il vantaggio di farlo è che ti ho centralizzata/O solo poche volte al giorno, in modo controllato, quindi hai solo un'istruzione SELECT molto leggera da fare quando hai bisogno di conoscere le statistiche.

+0

Grazie mille :-) Farò un tentativo, soprattutto perché è un cruscotto privato così reale- i dati temporali non saranno follemente importanti. Ti farò sapere se c'è qualcosa. –

Problemi correlati