Pregunta

Ahora las estructuras de tabla propuestas son:-

data_table
->impressions
->clicks
->ctr

O

data_table_1
->ctr

data_table_2
->impressions
->clicks

¿Qué consultas se ejecutan? Hay alrededor de 500 actualizaciones por segundo para las impresiones. Hay aproximadamente 1 actualización para hacer clic cada segundo. Hay alrededor de 500 actualizaciones por segundo para el CTR.

Ahora mi aplicación clasifica los datos utilizando el CTR. El CTR es la tasa de clics que se elabora por ctr = clicks/impressions. Ahora me he dado cuenta de que, a menos que haya una actualización de clic, el CTR no necesita actualizarse ya que se aumentan todas las impresiones de los artículos, lo que está disminuyendo el CTR en la misma relación, por lo que a menos que haya un clic, el CTR no necesita estar actualizado.

Actualmente, la consulta de actualización es como "Actualizar Data_Table Set Impressions = Impressions + 1, Ctr = Clicks / Impressions donde algo = algo

Esto significa que aunque 2 campos se actualizan a la vez, solo se ejecuta 1 consulta.

Ahora, el cuello de botella es que estas 500 actualizaciones en esto causan que la velocidad en la selección de esta tabla. Hay alrededor de 20 selecciones por segundo. Entonces pensé en separar las tablas. El nuevo estilo de tabla propone que las actualizaciones ocurran en una tabla separada y las selecciones ocurran en una tabla separada. La tabla de datos que contiene las impresiones se actualiza con mucha frecuencia, por lo que tener las actualizaciones para las impresiones realizadas realmente acelera el rendimiento en esta tabla. Esto significa que las selecciones en Data_Table_2 también serán más rápidas y el CTR se puede actualizar cada vez que alguien haga un clic.

Entonces, solo quería saber si debería usar la nueva estructura de la tabla o no. ¿Cuáles son sus sugerencias? ¡Pros y contras de mis propuestas!

¿Fue útil?

Solución

Tal vez esta no es una respuesta directa a su pregunta, pero creo que es importante que se anote.

Creo que debería considerar usar bases de datos NoSQL como Redis, MemCachedB, MongDB, CouchDB. Los DBM de relatación no son muy adecuados para este tipo de uso. Por ejemplo, cada vez que actualiza cualquier columna (UPDATE data_table SET impressions = impressions + 1) Los cachés se borran y el DB tiene que golpear el disco.

Otros piensan que puede considerar es usar memcache y volar esos datos al disco después de un período de tiempo.

Por ejemplo, si puede darse el lujo de perder algunas impresiones (recuerde que Memcache no persiste los datos) puede hacer las Precisiones ++ en MEMCACHE y actualizar los datos en el DB cada 5 minutos. Disminuiría su carga significativamente.

Espero que te ayude.

EDITAR:

Almacenar CTR es una buena idea, se llama "desnormalización" y puede funcionar en su aplicación si es un valor requerido con frecuencia.

Otros consejos

En primer lugar, supongo que la tabla está bien indexada para que el something = something El predicado dará como resultado rápidamente la fila correspondiente, ¿verdad?

Suponiendo que su cuello de botella sea el rendimiento del disco debido a la alta tasa de actualización, ¿qué hay de no almacenar el valor CTR en absoluto, ya que se puede calcular fácilmente en la marcha? Como parece estar limitado por su actualización, solo actualizar un campo debe aproximadamente la mitad del impacto de tener que escribir datos en el disco. Dado dicho escenario, donde la CPU es probablemente relativamente inactiva, calcular los clics/impresiones para cada resultado debería ser un problema. Su enfoque valdría la pena (nuevamente suponiendo que el disco es el factor limitante, que supone que es y se puede encontrar fácilmente mirando la utilización de la CPU), entonces su enfoque brindará beneficios considerables, IFF las tablas o en dos discos diferentes.

Si la CPU resulta ser el factor limitante, entonces probablemente sea porque el something = something El predicado es bastante complicado de evaluar en cuyo caso simplificar esto debería ser la principal preocupación y no dividir las tablas.

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