2010-11-15 11 views
8

estoy trabajando sin un sitio que almacena páginas vistas individuales en una tabla 'vistas':mejor manera de almacenar vistas/Estadísticas en MySQL

CREATE TABLE `views` (
    `view_id` bigint(16) NOT NULL auto_increment, 
    `user_id` int(10) NOT NULL, 
    `user_ip` varchar(15) NOT NULL, 
    `view_url` varchar(255) NOT NULL, 
    `view_referrer` varchar(255) NOT NULL, 
    `view_date` date NOT NULL, 
    `view_created` int(10) NOT NULL, 
    PRIMARY KEY (`view_id`), 
    KEY `view_url` (`view_url`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Es bastante básico, tiendas user_id (id de usuario en el sitio), su dirección IP, la URL (sin el dominio para reducir un poco el tamaño de la tabla), la URL de referencia (en realidad no la usa ahora y podría deshacerse de ella), la fecha (AAAA-MM-DD) formato de curso), y la marca de tiempo unix de cuando se produjo la vista.

La tabla, por supuesto, se está volviendo bastante grande (4 millones de filas en este momento y es un sitio bastante nuevo) y las consultas sobre ella son lentas.

Por alguna optimización básica ahora que he creado una tabla 'views_archive':

CREATE TABLE `views_archive` (
    `archive_id` bigint(16) NOT NULL auto_increment, 
    `view_url` varchar(255) NOT NULL, 
    `view_count` smallint(5) NOT NULL, 
    `view_date` date NOT NULL, 
    PRIMARY KEY (`archive_id`), 
    KEY `view_url` (`view_url`), 
    KEY `view_date` (`view_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Esto ignora la información de usuario (y URL de referencia) y almacena el número de veces a la url fue visto por día. Esta es probablemente la forma en que generalmente queremos usar los datos (cuántas veces se vio una página por día), por lo que las consultas deberían ser bastante rápidas, pero incluso si las utilizo para reemplazar principalmente la tabla de 'vistas' (derecha ahora me imagino que podría mostrar vistas de página por hora durante la última semana/mes más o menos y luego mostrar vistas diarias más allá de eso, así que solo necesitaría la tabla 'vistas' para contener datos de la última semana/mes) pero sigue siendo una gran mesa.

De todos modos, para resumir, me pregunto si puede darme algún consejo sobre cómo manejar mejor el almacenamiento de las estadísticas/páginas vistas en un sitio MySQL, el objetivo es mantener el tamaño de la tabla (s) en el DB lo más pequeño posible y aún así poder consultar fácilmente (y al menos relativamente rápido) la información. He analizado un poco las tablas particionadas, pero el sitio no tiene instalado MySQL 5.1. Cualquier otro consejo o pensamiento que pueda ofrecer sería muy apreciado.

+0

umm, doesn ¿Tu servidor tiene un registro de acceso que ya guarda todos estos datos? Hay muchos visualizadores/resúmenes de registros disponibles para los registros de acceso web. ¿Hay alguna razón convincente para no usar uno de ellos? – dnagirl

+0

¿Cuál es el propósito de la columna view_created? –

+0

El propósito de la columna view_created, MicWafflestix, se usaría si quisiera mostrar vistas por hora (por ejemplo, cuántas veces se visualizó un artículo cada hora hoy). Supongo que podría usar DATETIME en lugar de INT (10) timestamp, pero no estoy seguro de que eso me ayude mucho. – Charlie

Respuesta

1

Probablemente desee tener una tabla solo para páginas, y las vistas de usuario tienen una referencia a esa tabla. Otra optimización posible sería tener la IP del usuario almacenada en una tabla diferente, tal vez alguna información de tabla de sesión. Eso debería reducir un poco los tiempos de consulta. Estás en el camino correcto con la tabla de archivos; las mismas optimizaciones deberían ayudar a eso también.

+0

Me gusta esta idea. Parece una optimización bastante básica y sólida de la estructura de datos (en lugar de actualizar mysql o usar una tabla nosql o algún otro cambio tan grande que temí que tendría que hacer). También descubrí la función INET_ATON() en MySQL que podría ayudarme a reducir el tamaño de almacenamiento de la dirección IP (puede usar INT en lugar de VARCHAR). Para el corto plazo, de todos modos, creo que las soluciones que mencionaste recorrerán un largo camino para solucionar mis problemas. Gracias. – Charlie

+0

@ Charlie: de nada. A gran escala, las pequeñas optimizaciones realmente comienzan a marcar una gran diferencia; al mismo tiempo, algunas de las optimizaciones realmente complejas simplemente no dan el rendimiento que a menudo se espera. Creo que buscar las optimizaciones sencillas y sencillas primero suele ser lo que me lleva al 90% de una buena solución, si no todo el camino hasta allí. –

1

Archivo de motor de almacenamiento de MySQL

http://dev.mysql.com/tech-resources/articles/storage-engine.html

Es ideal para los registros, es rápido para escribir, el único inconveniente es la lectura es un poco más lento. pero es ideal para tablas de registro.

+0

Eché un vistazo a eso un poco el otro día. Parece interesante, pero no es 'compatible' (comprobado a través de SHOW ENGINES; query) en mi instalación actual de MySQL. Le pediré a la gente de alojamiento que lo active o lo que sea y juegue con él. Gracias por el consejo. – Charlie

+0

El enlace está roto. –

0

Suponiendo que su aplicación es un blog y desea realizar un seguimiento de las vistas de sus publicaciones de blog, probablemente tenga una tabla llamada blog_posts. En esta tabla, le sugiero que cree una columna llamada "vistas" y en esta columna, almacenará un valor estático de cuántas vistas tiene esta publicación. Seguirá utilizando la tabla views, pero eso solo se utilizará para realizar un seguimiento de todas las vistas (y para hacer comprobaciones si son "únicas" o no).

Básicamente, cuando un usuario visita una publicación de blog, verificará la tabla views para ver si se debe agregar. Si es así, también incrementará el campo "vistas" en la fila correspondiente para la publicación del blog en blog_posts. De esta forma, puede consultar el campo "vistas" de cada publicación para obtener un vistazo rápido de la cantidad de visitas que tiene. Puede llevar esto un paso más allá y agregar redudancy configurando un trabajo CRON para volver a contar y verificar todas las vistas y actualizar cada fila blog_posts en consecuencia al final del día.O si lo prefiere, también puede realizar un recuento de cada actualización si la precisión del segundo es clave.

Esta solución funciona bien si su sitio está intensivo de leer y que están constantemente tener que obtener un recuento de cómo muchos puntos de vista cada entrada del blog tiene (una vez más, asumiendo que es su aplicación :-))

Cuestiones relacionadas