Cómo paginar grandes cantidades de datos

Este artículo es compartido por Ma Le de la comunidad en la nube de Huawei " Procesamiento de paginación de grandes datos en aplicaciones ".

Introducción

La visualización de grandes cantidades de datos siempre se ha considerado un problema que debe resolverse. Una idea clásica es exponerlos y procesarlos en lotes.

1 Procesamiento de claves foráneas durante la consulta

Si el modelo usa claves externas en el modelo Django, defina la operación relacionada a través de on_delete.

CASCADA: Funcionamiento en cascada. Si se eliminan los datos de la clave externa, estos datos también se eliminarán.
PROTEGER: Protegido, siempre que estos datos se refieran a los datos de la clave externa, los datos de la clave externa no se pueden eliminar. Si se eliminan por la fuerza, el marco de Django informará un error.
SET_NULL: Establecido en NULL Si se eliminan los datos de la clave externa, estos datos se establecen en NULL, siempre que estos datos se puedan establecer en NULL.
SET_DEFAULT: establece el valor predeterminado. Si se eliminan los datos de la clave externa, establezca el valor de estos datos en el valor predeterminado, siempre que exista un valor predeterminado.
Función SET(): Si se eliminan los datos de la clave foránea, el valor de la función SET se obtendrá como el valor de la clave foránea. La función Set() puede aceptar un objeto invocable y el valor de retorno del objeto invocable se restablece como resultado.
DO_NOTHING: No se realiza ninguna acción, todo depende del comportamiento a nivel de la base de datos.

Restricciones a nivel de base de datos:

PESTRICT: Opción predeterminada. Si desea eliminar registros de la tabla principal, si la tabla secundaria tiene registros relacionados, no se permite la eliminación.
	NOACTION: Igual que arriba, primero detecta claves externas
	CASCADA: cuando la tabla principal se elimina y actualiza, las operaciones de asociación de la tabla secundaria también se eliminan y actualizan.
	SET NULL: cuando la tabla principal se elimina o actualiza, la tabla secundaria establece el campo de clave externa del registro asociado en nulo, por lo que no puede ser nulo al diseñar la tabla secundaria.

Estas herramientas de métodos de clave externa pueden ayudar a los usuarios a manejar tareas de consulta relacionadas con varias tablas.

1.1 Cómo consultar la paginación en Django

En aplicaciones con consultas de paginación, las consultas que incluyen LIMIT y OFFSET son muy comunes y casi todas tendrán una cláusula ORDER BY.

Si utiliza la clasificación por índice, será muy útil para optimizar el rendimiento; de lo contrario, el servidor deberá ordenar muchos archivos.

Un problema de alta frecuencia es que el valor de compensación es demasiado grande. Si la consulta es como LIMIT 10000, se generarán 20, 10020 filas y se descartarán las 10000 filas anteriores, lo cual es muy costoso.

seleccione * del orden de la tabla por límite de identificación 10000, 20;

Es muy simple: el significado de esta declaración es consultar 10000+20 registros, eliminar los primeros 10000 registros y devolver los últimos 20 registros.
No hay duda de que esta consulta puede lograr paginación, pero cuanto mayor sea el valor de 10000, menor será el rendimiento de la consulta, porque MySQL necesita escanear los 10000+20 registros.

Suponiendo que se accede a todas las páginas con la misma frecuencia, dicha consulta escaneará la mitad de la tabla de datos en promedio. Para optimizarlas, puede limitar la cantidad máxima de páginas accesibles en vistas paginadas o hacer que las consultas por lotes grandes sean más eficientes.

Cuando hay muchos datos que cumplen con las condiciones de consulta en una tabla, a menudo no necesitamos sacarlos todos a la vez, lo que será un gran desafío para la eficiencia de la consulta o el rendimiento del servidor: por ejemplo, en el centro comercial más simple, Supongamos que hay 10,000 datos en el centro comercial, pero es posible que solo veamos una página a la vez en la parte frontal.

seleccione * de la tabla donde xxx="xxx" límite 10;

Esto significa consultar 10 datos que cumplan las condiciones.

seleccione * de la tabla donde xxx="xxx" límite 10 desplazamiento 10;

Esto significa paginar y consultar los datos del 11 al 20 que cumplen con las condiciones.

O consultar especificando la identificación máxima

seleccione * de la tabla donde id > #max_id# ordene por límite de id n;

Esta consulta también devolverá los últimos n registros, pero no es necesario escanear los primeros m registros como el método 1, pero se debe obtener la identificación máxima (o identificación mínima) de la consulta anterior (página anterior) en cada consulta, que se usa más comúnmente.

Por supuesto, el problema con esta consulta es que si la ID máxima no es continua, es posible que no podamos obtener la ID. Por ejemplo, si actualmente estamos en la página 3 y necesitamos consultar los datos de la página 5, lo obtendremos. no trabajo.

O mediante una subconsulta, primero filtre los primeros 10,000, busque el ID más grande y luego seleccione los 20 restantes que cumplan con los requisitos.

seleccione * de la tabla donde id > (seleccione id de la tabla ordene por id límite m, 1) límite n;

Esta consulta también escanea el ID del campo a través de una subconsulta, porque no requiere asociación de tabla, pero es una comparación simple. Este es un uso recomendado cuando no se conoce el ID máximo en la página anterior.

El método de conexión izquierda-derecha puede tener un peor rendimiento.
También existen las siguientes subconsultas, unir tablas, agregar índices para localizar rápidamente tuplas y luego leer las tuplas.

SELECCIONAR * DE la tabla DONDE id <= (SELECCIONAR id DE la tabla ORDEN POR id DESC LIMIT (página-1)*tamaño de página ORDENAR POR id DESC LIMIT tamaño de página)

rest_framework tiene un módulo de operación de paginación incorporado, apliquémoslo a funciones específicas en empleado/views.py

desde rest_framework.pagination importar PageNumberPagination
@api_view(['OBTENER', 'POST'])
@permission_classes([Permiso personalizado])
def blog_api_view(solicitud):
    """"""
    si request.method == "OBTENER":
		paginador = PaginaciónNúmeroPágina()
        # paginator.page_size = 1 configuración, mostramos solo 1 elemento por página.
        paginador.page_size = 2
        task_objects = EmpleadoSign.objects.all()
        resultado = paginator.paginate_queryset(task_objects, solicitud)

Si no se utiliza la paginación, todos los mensajes se mostrarán en la misma página.

serializador = TaskSerializer (resultado, muchos = Verdadero)
        respuesta de retorno (serializador.datos)

Acceda a los datos de paginación. La interfaz predeterminada http://127.0.0.1:2001/api/tasks/ es la paginación 1.

http://127.0.0.1:2001/api/tasks/?page=1 #2,3,4...

2 Resumen

Nuevamente, en aplicaciones con consultas paginadas, las consultas que involucran LIMIT y OFFSET son muy comunes, y casi todas tendrán una cláusula ORDER BY. Si utiliza la clasificación por índice, será muy útil para optimizar el rendimiento; de lo contrario, el servidor deberá ordenar muchos archivos.

Un problema de alta frecuencia es que el valor de compensación es demasiado grande. Si la consulta es como LIMIT 10000, se generarán 20, 10020 filas y se descartarán las 10000 filas anteriores, lo cual es muy costoso.

Suponiendo que se accede a todas las páginas con la misma frecuencia, dicha consulta escaneará la mitad de la tabla de datos en promedio.

Para optimizarlas, puede limitar el número máximo de páginas accesibles en vistas paginadas o hacer que las consultas grandes sean más eficientes.

Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~

La primera actualización importante de JetBrains 2024 (2024.1) es de código abierto. Incluso Microsoft planea pagar por ella. ¿Por qué todavía se le critica por ser de código abierto? [Recuperado] El backend de Tencent Cloud falló: una gran cantidad de errores de servicio y no hay datos después de iniciar sesión en la consola. Alemania también necesita ser "controlable de forma independiente". El gobierno estatal migró 30,000 PC de Windows a Linux deepin-IDE y finalmente logró ¡arranque! Se lanza Visual Studio Code 1.88. Buen chico, Tencent realmente ha convertido a Switch en una "máquina de aprendizaje pensante". El escritorio remoto de RustDesk inicia y reconstruye el cliente web. La base de datos de terminal de código abierto de WeChat basada en SQLite, WCDB, ha recibido una actualización importante.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/11051586
Recomendado
Clasificación