2011-12-20 10 views
6

Come creare una struttura adeguata per un servizio di analisi? Attualmente ho una tabella che memorizza i dati su ogni utente che visita la pagina con l'ID del mio cliente, quindi più tardi i miei clienti potranno vedere le statistiche per una data specifica.Come costruire un database corretto per un sistema di analisi del traffico?

Ho pensato un po 'oggi e mi chiedo: diciamo che ho 1.000 utenti e ognuno ha circa 1.000 impressioni sui loro siti ogni giorno, significa che ottengo 1.000.000 (1M) nuovi record ogni giorno in un unico tavolo. Come funzionerà dopo circa 2 mesi (quando il tavolo raggiunge i 60 milioni di dischi)?

Penso solo che dopo un po 'di tempo avrà così tanti record che le query PHP per estrarre i dati saranno davvero pesanti, lenti e richiedere un sacco di risorse, è vero? e come prevenirlo?

Un mio amico che lavora su qualcosa di simile e preparerà un nuovo tavolo per ogni cliente, è questo il modo corretto di andare?

Grazie!

+0

considera di fare riferimento a un libro! – linuxeasy

+1

@linuxeasy quale? – k102

risposta

1

Consider this Link to the Google Analytics Platform Components Overview page e prestare particolare attenzione al modo in cui i dati vengono scritti nel database, basandosi semplicemente sull'architettura dell'intero sistema.

Invece di scrivere tutto nel database subito, è possibile scrivere tutto in un file di registro, quindi elaborare il registro in un secondo momento (forse in un momento in cui il traffico non è così elevato). Alla fine della giornata, avrai comunque bisogno di fare tutte quelle scritture nel tuo database, ma se le impili insieme e le fai quando quel tipo di carico è più tollerabile, il tuo sistema scalerà molto meglio.

+1

questa non è una risposta, dovrebbe essere un commento! – k102

+0

Un collegamento che non spiega nulla del ridimensionamento. -1 per fuorviante. –

+0

+1 È un buon collegamento e correlato all'argomento. Aiuterebbe l'OP a leggerlo. – PiTheNumber

-1

È possibile normalizzare le impressioni i dati come questo;

Client Table 
{ 
    ID 
    Name 
} 


Pages Table 
{ 
    ID 
    Page_Name 
} 

PagesClientsVisits Table 
{ 
    ID 
    Client_ID 
    Page_ID 
    Visits 
} 

e solo incrementare le visite sul tavolo finale su ogni nuova impressione. Quindi il numero massimo di record in esso diventa (numero di client * Numero di pagine)

+0

Grazie per la tua risposta ma non funziona in questo modo, le statistiche sono piuttosto profonde e la tabella memorizza un nuovo record per ogni visita con i visitatori IP e Paese, il che significa che non posso davvero scrivere un numero in 'Visite ' . – Ricardo

+0

Capito - pensavo che i tuoi clienti fossero gli stessi dei tuoi visitatori. Potresti facilmente sostituire la tabella "Clienti" con la tabella "Visitatori" e comunque usare questa tecnica. È difficile commentare senza capire meglio la tua applicazione. –

-1

Avere un tavolo con 60 milioni di record può essere ok. Ecco a cosa serve un database. Ma dovresti fare attenzione a quanti campi hai nella tabella. Anche quale tipo di dati (=> dimensione) ha ogni campo.

Si crea una sorta di report sui dati. Pensa a quali dati hai veramente bisogno per quei rapporti. Ad esempio potresti aver bisogno solo del numero di visite per utente su ogni pagina. Un semplice conteggio farebbe il trucco.

Ciò che è anche possibile fare è generare il rapporto ogni notte ed eliminare i dati non elaborati in seguito.

Quindi, leggere e pensarci.

+0

Il collegamento fornisce ancora 0 informazioni sul ridimensionamento del database. –

+0

bella spiegazione per semplificare le cose! – linuxeasy

2

Il problema che si sta affrontando è il sistema di I/O. 1 milione di record al giorno è di circa 12 query di scrittura al secondo. Ciò è possibile, ma estrarre i dati mentre si scrive contemporaneamente renderà il sistema vincolato a livello di HDD.

Quello che devi fare è configurare il tuo database per supportare il volume I/O che stai facendo, ad esempio: usa il motore di database appropriato (InnoDB e non MyISAM), assicurati di avere un sottosistema HDD abbastanza veloce (RAID , non unità regolari poiché possono e falliranno a un certo punto), progettare il database in modo ottimale, ispezionare le query con EXPLAIN per vedere dove si potrebbe essere andato male, magari utilizzare un altro motore di archiviazione - personalmente, io userei TokuDB se fossi in te.

E inoltre, spero sinceramente che tu stia eseguendo le tue query, ordinamento, filtro sul lato del database e non sul lato PHP.

+0

Quindi suggerire di utilizzare il motore InnoDB è l'informazione hardware per te? Inoltre, si sceglie di svendere una risposta che aiuti effettivamente qualcuno a progettare il sistema. Dovresti anche rispondere alle domande su SO con quel tipo di atteggiamento che non aiuta nessuno? –

+0

non c'è problema con me, ma con te! tutto e tutto può costituire per progettare un sistema, direttamente da PHP, dall'hardware e da tutto e per tutto! meglio correggere il tuo atteggiamento e fare le cose per bene su SO! – linuxeasy

+0

Mi dispiace ma non entrerò in discussioni così infantili con qualcuno che apparentemente non ha idea di cosa stia parlando. –

Problemi correlati