Clasificación con mysql: actualizar vs seleccionar

Estoy desarrollando un juego web con muchos usuarios. En la pantalla principal habrá un mapa con muchos marcadores. Cada marcador está vinculado a un usuario y cada usuario tiene una posición en un ranking (calculado con sus puntos) que quiero mostrar.

Para calcular dinámicamente la posición del ranking hemos encontrado lo siguiente de aquí:

SET @rownum := 0;
SELECT rank, points FROM (
                    SELECT @rownum := @rownum + 1 AS rank, points, uid
                    FROM landings ORDER BY points DESC
                    ) as result WHERE uid=xxxxxxxx

Pero esta consulta se activará para cada nuevo marcador cargado en el mapa, cada vez que un jugador mueva el mapa a una zona inexplorada.

Por otro lado, ¿qué pasa si cada vez que un jugador termina un juego, actualizo un campo de rango para cada usuario en la base de datos? Esto suena enorme, por supuesto, pero este escenario es menos frecuente que el otro. ¿Qué piensas? ¿Una actualización es mucho menos eficiente que una selección? ¿Cuánto cuesta?

Gracias por su ayuda!

Edite para obtener más explicaciones: este dibujo muestra la pantalla. Hay un mapa con muchos marcadores, y por cada marcador en pantalla se dispara la consulta que explico antes (cuando cargo los marcadores por AJAX). La otra opción es que cada vez que un usuario juega un juego y, por supuesto, modifica su cantidad total de puntos, se actualizaría un supuesto campo de "rango" en la base de datos para cada usuario en la base de datos. enter image description here

preguntado el 04 de julio de 12 a las 10:07

¿Puedes por favor aclarar más tu problema?

Edité la pregunta con un sorteo. ¿Quizás es un problema de idioma? Mi inglés podría ser mejor... -

1 Respuestas

Es imposible decir cuál va a ser más eficiente. Depende totalmente de la cantidad de actualizaciones en la columna de puntos, la cantidad total de registros en la tabla y la cantidad de solicitudes de clasificación. Si conoce los números o puede hacer una buena suposición, compare con datos de prueba aleatorios. Si no puede, vaya con la solución que sea más fácil de implementar y mejórela si alguna vez se convierte en un problema.

Respondido 04 Jul 12, 14:07

Mi problema es que no tengo experiencia con bases de datos y no tengo la noción de cuán eficiente es la selección que propuse, o una actualización similar. Con esta información podría pensar con las variables que explicas (número de entradas... frecuencia de actualización). Por supuesto, supongo que habría que dejar pasar el tiempo y esperar a que aparezca algún problema, pero este es un proyecto con poco tiempo de vida, donde cada hora cuenta, y se agradecerá mucho la información sobre los costes de las consultas. - dgnin

Veo. Aquí hay algunos datos de tiempo que hice usando una tabla MySQL InnoDB con 400k registros (todos los cuales InnoDB guarda en RAM), cada uno con un puñado de campos. La actualización de un campo en cada registro tarda unos 2 segundos en mi Core i3.1 de 3 GHz. Actualizar un campo con un índice aumenta el tiempo de consulta a aproximadamente 8 segundos. - Simon

La consulta de clasificación SELECT anterior toma alrededor de 270 ms, con un índice tanto en los puntos como en el campo uid. Si no calculo la clasificación sobre la marcha, sino que selecciono otro campo de la tabla (como lo haría si tuviera los datos de clasificación actualizados en cada juego), el tiempo de consulta se reduce a 1 ms. - Simon

Por lo tanto, el tiempo que verá se desviará fácilmente por órdenes de magnitud (excepto en el último caso, probablemente), porque también depende del tamaño en bytes de cada registro, de su hardware, de la cantidad de memoria que puede dedicar a MySQL, sobre la carga general en la máquina, sobre cuántas consultas simultáneas habrá, etc. Si tuviera que decidir qué camino tomar, y si esperaría menos de una actualización del ranking por segundo, prescindir de un campo de clasificación real en la base de datos y almacenar en caché las entradas clasificadas (el resultado de la consulta SELECT interna) fuera de la base de datos. - Simon

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.