2011-12-20 12 views
6

¿Cómo construir una estructura adecuada para un servicio de análisis? Actualmente tengo 1 tabla que almacena datos sobre cada usuario que visita la página con la ID de mi cliente para que luego mis clientes puedan ver las estadísticas de una fecha específica.¿Cómo construir una base de datos adecuada para un sistema de análisis de tráfico?

He pensado un poco hoy y me pregunto: digamos que tengo 1,000 usuarios y cada uno tiene alrededor de 1,000 impresiones diarias en sus sitios, significa que obtengo 1,000,000 (1M) de nuevos registros todos los días en una sola tabla. ¿Cómo funcionará después de 2 meses más o menos (cuando la tabla alcanza los 60 millones de registros)?

Creo que, después de un tiempo, tendrá tantos registros que las consultas de PHP para extraer los datos serán realmente pesadas, lentas y requerirán muchos recursos, ¿es cierto? y cómo prevenir eso?

Un amigo mío que trabaja en algo similar y que va a hacer una nueva mesa para cada cliente, ¿es esta la forma correcta de hacerlo?

Gracias!

+0

considere la posibilidad de recomendar un libro! – linuxeasy

+1

@linuxeasy cuál? – k102

Respuesta

1

Consider this Link to the Google Analytics Platform Components Overview page y preste especial atención a la forma en que los datos se escriben en la base de datos, simplemente en función de la arquitectura de todo el sistema.

En lugar de escribir todo en su base de datos de inmediato, puede escribir todo en un archivo de registro, luego procesar el registro más tarde (tal vez en un momento en que el tráfico no es tan alto). Al final del día, aún tendrá que hacer todas esas escrituras en su base de datos, pero si las combina y las hace cuando ese tipo de carga es más tolerable, su sistema escalará mucho mejor.

+1

esto no es una respuesta, ¡debería ser un comentario! – k102

+0

Un enlace que no explica nada sobre la escala. -1 por engañoso. –

+0

+1 Es un buen enlace y está relacionado con el tema. Ayudaría al OP leerlo. – PiTheNumber

-1

Puede normalizar las impresiones de los datos como este;

Client Table 
{ 
    ID 
    Name 
} 


Pages Table 
{ 
    ID 
    Page_Name 
} 

PagesClientsVisits Table 
{ 
    ID 
    Client_ID 
    Page_ID 
    Visits 
} 

y simplemente incremente las visitas en la tabla final en cada nueva impresión. Entonces la cantidad máxima de registros allí se convierte en (Nº de clientes * Nº de páginas)

+0

Gracias por su respuesta, pero no funciona de esta manera, las estadísticas son bastante profundas y la tabla almacena un nuevo récord para cada visita con los visitantes IP y País, lo que significa que no puedo simplemente escribir un número en 'Visitas' . – Ricardo

+0

Entendido, pensé que sus clientes eran lo mismo que sus visitantes. Sin embargo, puede simplemente reemplazar la tabla "Clientes" con la tabla "Visitantes" y aún usar esta técnica. Es difícil hacer comentarios sin entender un poco mejor tu aplicación. –

-1

Tener una tabla con 60 millones de registros puede estar bien. Para eso es una base de datos. Pero debe tener cuidado sobre cuántos campos tiene en la tabla. También qué tipo de datos (=> tamaño) tiene cada campo.

Crea algún tipo de informes sobre los datos. Piense en qué datos realmente necesita para esos informes. Por ejemplo, es posible que solo necesite los números de visitas por usuario en cada página. Un conteo simple haría el truco.

Lo que también puede hacer es generar el informe cada noche y eliminar los datos sin procesar después.

Así que, léelo y piénselo.

+0

El enlace todavía proporciona 0 información sobre escalar la base de datos. –

+0

buena explicación para simplificar las cosas! – linuxeasy

2

Problema que enfrenta es el sistema de E/S encuadernado. 1 millón de registros por día son aproximadamente 12 consultas de escritura por segundo. Eso es factible, pero extraer los datos mientras se escribe al mismo tiempo hará que su sistema se vincule al nivel de la unidad de disco duro.

Lo que necesita hacer es configurar su base de datos para admitir el volumen de E/S que va a realizar, como - use el motor de base de datos apropiado (InnoDB y no MyISAM), asegúrese de tener subsistema de disco duro lo suficientemente rápido (RAID , no unidades normales ya que pueden fallar y fallarán en algún momento), diseñe su base de datos de manera óptima, inspeccione las consultas con EXPLAIN para ver dónde podría haber ido mal con ellas, tal vez incluso use un motor de almacenamiento diferente - personalmente, usaría TokuDB si yo fuera tú.

Y también, sinceramente espero que esté haciendo su consulta, clasificación, filtrado en el lado de la base de datos y no en el lado de PHP.

+0

¿Por lo tanto, sugerir utilizar el motor InnoDB es información de hardware para usted? Además de eso, optas por rechazar una respuesta que realmente ayude a alguien a diseñar el sistema. ¿Debería incluso responder preguntas sobre SO con ese tipo de actitud que no ayuda a nadie? –

+0

no hay problema de actitud conmigo, ¡pero contigo! ¡Cualquier cosa y todo puede constituir un diseño de sistema, desde PHP, hardware y solo a todos! ¡corrija mejor su actitud y haga las cosas bien en SO! – linuxeasy

+0

Lo siento, pero no me meteré en discusiones tan infantiles con alguien que aparentemente no tiene ni idea de lo que está hablando. –

Cuestiones relacionadas