Pregunta

Tengo un sitio donde los usuarios pueden ver un gran número de publicaciones. Cada vez que se hace esto, ejecuto una consulta similar a UPDATE table SET views = views + 1 WHERE id =? . Sin embargo, este enfoque tiene varios inconvenientes:

  • No hay forma de realizar un seguimiento cuando se producen las vistas de página, simplemente se incrementan.
  • Actualizar la tabla que a menudo, en lo que yo entiendo, borrará el caché de MySQL de la fila, por lo que el siguiente SELECTO de esa fila será más lento.

Por lo tanto, considero emplear un enfoque donde creo una tabla, por ejemplo:
object_views {object_id, year, month, day, views} , para que cada objeto tenga una fila pr. dia en esta mesa Luego actualizaría periódicamente la columna de vistas en la tabla objetos para no tener que hacer uniones costosas todo el tiempo.

Esta es la solución más simple que se me ocurre, y parece que también es la que tiene el menor impacto en el rendimiento. ¿Estás de acuerdo?

(El sitio está construido en PHP 5.2, Symfony 1.4 y Doctrine 1.2 en caso de que te preguntes)

Editar:
El propósito es no analítica web. Sé cómo hacerlo y eso ya está en marcha. Hay dos propósitos:

  • Permitir que el usuario vea cuántas veces se ha mostrado un objeto determinado, por ejemplo, hoy o ayer.
  • Permitir que los moderadores del sitio vean las estadísticas de simple sin entrar en Google Analytics, Omniture ni ninguna otra solución. Además, los resultados en el backend deben ser en tiempo real, una característica que GA no puede ofrecer en este momento. No deseo utilizar la API de Analytics para recuperar los datos de uso (no en tiempo real, GA requiere javascript).
¿Fue útil?

Solución

Cita: Actualizar la tabla que a menudo, en lo que yo entiendo, borrará el caché de MySQL de la fila, haciendo así más lento el siguiente SELECTO de esa fila.
Hay mucho más que esto. Este es el asesino de base de datos. Te sugiero que hagas una mesa como esta: object_views {object_id, timestamp} De esta manera puede agregar en la función object_id (count ()). Así que cada vez que alguien vea la página, insertará el registro en la tabla. De vez en cuando debes limpiar los registros antiguos en la tabla. Declaración de actualización es malvada :) En la mayoría de las plataformas, básicamente marcará la fila como eliminada e insertará una nueva, lo que hará que la tabla se fragmente. Sin mencionar los problemas de bloqueo.

Espero que ayude

Otros consejos

En la misma línea que Rage, simplemente no obtendrá los mismos resultados al hacerlo usted mismo cuando haya un millón de herramientas de registro de terceros. Si realiza un seguimiento diario, entonces un programa básico como webtrends es perfectamente capaz de rastrear los accesos, especialmente si su URL contiene los ID de los elementos que desea rastrear ... No puedo enfatizar esto lo suficiente, es todo. sobre la URL cuando se trata de estas herramientas (Wordpress, por ejemplo, permite muchas construcciones de URL diferentes)

Ahora, si está buscando en " impresión " el seguimiento es otro juego de pelota porque probablemente estés rastreando cada objeto, la página, el usuario y posiblemente un valor ponderado según la ubicación en la página. Si este es el caso, puede mantener su rendimiento al aloja el seguimiento en otro servidor donde puede disparar y olvidar. En el pasado trabajé esto utilizando la actualización de SQL con el ID y una versión de cadena de la fecha ... de esa manera, cuando la fecha cambia de 20091125 a 20091126, es una consulta simple sin la sobrecarga de, digamos, una función de fecha.

Primero solo un comentario rápido, por qué no agregar el año, mes, día en DATETIME , tendría más sentido en mi mente.

Tampoco estoy realmente seguro de cuál es la razón exacta por la que está haciendo eso, si es para un propósito de marketing / estadísticas web, es mejor utilizar una herramienta creada para tal fin.

Ahora hay dos grandes familias de herramientas capaces de darle una idea de las estadísticas de acceso a su sitio web, una basada en el registro ( awstats es probablemente el más popular, basado en imágenes ajax / 1pixel ( Google Analytics sería el más popular).

Si prefiere crear su propia base de datos de estadísticas, probablemente pueda administrar la creación de un analizador de registros fácilmente usando PHP. Si considera que el análisis de los registros de apache (o los registros de IIS) es una carga excesiva, probablemente haga que su aplicación ofrezca algunos registros personalizados formados de una manera más sencilla.

Otra solución posible es utilizar memcached , el demonio proporciona algún tipo de contador que puedes increment . Puede registrar la vista allí y tener un script que recopile el resultado todos los días.

Si vas a hacer eso, ¿por qué no solo registras cada acceso? MySQL puede almacenar en caché las inserciones en tablas continuas bastante bien, por lo que no debería haber una desaceleración notable debido a la inserción. Siempre puede ejecutar Mostrar perfiles para ver cuál es realmente la penalización de rendimiento.

En el tema de fecha y hora, siempre puede usar GRUPO POR MES (accedido en), AÑO (accedido en) o DONDE MES (accesado_at) = 11 Y AÑO (accesado_at) = 2009 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top