He escrito un pequeño juego estúpido y quiero tener algún tipo de sitio web de la tabla de líderes.Esquema/consulta SQL eficiente para una tabla de líderes
Por lo general, las tablas de clasificación están limitadas a 10 o 20 jugadores principales, pero pensé que sería bueno si pudiera registrar, para cada jugador, su puntaje máximo. Entonces, siempre podría mostrar su rango mundial.
Un esquema simple, como:
create table leaderboard (
userid varchar(128) not null,
score real not null,
when datetime not null
);
create index on leaderboard(userid);
almacenaría la cantidad mínima de información que necesito - 1 entrada por usuario con su mejor puntuación.
Mi pregunta gira en torno a cómo determinar de manera eficiente la posición de alguien en la tabla de líderes. La idea general es que me gustaría que su posición en la lista devuelta por:
select userid from leaderboard order by score desc
Pero ejecución de esta consulta y luego buscar linealmente la lista parece un poco ridículo a mí desde el punto de vista de rendimiento DB. Aun así, me está costando imaginar una consulta/esquema que lo convierta en una operación rápida.
¿Alguna idea?
(yo preferiría mantener el esquema de base de datos y consulta genérica (no atado a un proveedor). Sin embargo, si un vendedor lo hace fácil, estoy feliz de usar ya sea MS SQL o MySQL.
Por aclaración, solo estoy almacenando su mejor puntaje. –
OK, entonces un índice en el mejor puntaje sería su mejor apuesta. Si SELECCIONA COUNT (1) FROM leaderboard DONDE topscore> = (SELECCIONAR puntaje ... etc.) será eficiente, ya que se podrá resolver simplemente escaneando el índice sin referencia a la tabla en sí. – dkretz