¿Cuáles son las mejores prácticas para implementar la paginación en un sitio web con una gran cantidad de datos?

La mejor optimización es crear un índice que haya diseñado para que funcione específicamente bien con los tipos de consultas que ejecutará.

Dependiendo de su aplicación, muchas veces puede calcular previamente la clasificación de los elementos que va a mostrar. Supongamos que desea crear un directorio de productos indexados por palabras clave y ordenados por un puntaje arbitrario, por lo que la primera página de resultados para la consulta “flores” le daría las páginas más altas relacionadas con flores.

En la práctica, es posible que desee dividir la carga en varias máquinas y hay muchas maneras de hacerlo (por ejemplo, un servidor puede manejar todas las consultas que comienzan con la letra “f”, suponiendo que la carga se distribuye uniformemente en todas las letras ) Puede agregar fragmentos más adelante si es necesario, pero a veces es más barato cargar una tonelada de RAM en su máquina. La replicación de su base de datos también distribuye la carga (hecho interesante: si elige el menos cargado de dos servidores elegidos al azar, ¡puede reducir exponencialmente la carga máxima esperada en comparación con elegir uno al azar! [1]).

En su forma más simple, su tabla de búsqueda tendría tres columnas: keyword , product_id y rank . Tenga en cuenta que la palabra clave y el rango se calculan sin conexión; realmente no quieres calcular esta información sobre la marcha. Cree un índice compuesto y agrupado en las columnas de keyword y rank , en ese orden. El índice compuesto hace que sea eficiente consultar filas primero por una palabra clave y luego por su rango en relación con otras filas con esa misma palabra clave. La agrupación significa que las filas con la misma palabra clave y rangos similares estarán cercanas entre sí en el disco (preferiblemente en la misma página de la base de datos) para que puedan leerse secuencialmente y explotar la localidad espacial.

En MS SQL, el índice compuesto probablemente será dos árboles B que deberían estar bien; El índice de árbol en el rank hace que las consultas de rank sean eficientes. En teoría, podría usar un índice hash para las palabras clave y los árboles B para los rangos. Algunos DBMS también le permitirán particionar el índice.

Una vez que la base de datos está configurada, puede recuperar un rango de resultados.

 SELECT P.* FROM products AS P INNER JOIN lookup AS L ON L.id = P.product_id WHERE L.keyword = 'flowers' AND 0 <= L.rank AND L.rank < 10; 

Debería ser fácil asignar números de página en su aplicación a rangos de rangos, y viceversa. Alternativamente, si no desea números de página y solo tiene enlaces “Siguiente” y “Anterior”, puede cambiar la consulta de rango a 0 <= rank LIMIT 10 , y luego usar los rangos del primer y último resultado para determinar las consultas para las páginas siguientes / anteriores.

Finalmente, memcached ayuda mucho como señala Jinghao, especialmente si está realizando uniones en su consulta más adelante. Memcached también es ideal para atender consultas calientes muy rápidamente. Construí algo similar a esto en Facebook hace dos años. En un error de caché, las llamadas mysql_query tardan menos de 12 ms.

Algunas diapositivas para leer más: http://www.scribd.com/doc/146832…

[1] Y. Azar, AZ Broder, AR Karlin y E. Upfal, Asignaciones equilibradas , Actas del 26º Simposio anual de ACM sobre la teoría de la informática , págs. 593–602, mayo de 1994.

Con los detalles limitados y el alcance de esta pregunta, solo puedo dar una respuesta de alcance limitado: mantenga los datos ordenados en la base de datos (es decir, el índice BTREE en la columna de clasificación) y agregue una capa de almacenamiento en caché en la parte superior (es decir, Memcached).