sql >> Base de Datos >  >> RDS >> Mysql

el procesamiento de una gran cantidad de entradas de la base de datos con paginación se ralentiza con el tiempo

Esto es lo que hice y reduje el tiempo total de ejecución en un factor de 10.

Lo que me di cuenta del plan de ejecución de mi consulta original fue que estaba usando filesort para ordenar todos los resultados e ignorar los índices. Eso es un desperdicio.

Mi base de datos de prueba:5 M de registros, 20 GB de tamaño. estructura de tabla igual que en la pregunta

En lugar de obtener blobCol directamente en la primera consulta, primero obtengo el valor de 'nombre' para el comienzo de cada página. Ejecute esta consulta indefinidamente hasta que devuelva 0 resultados. Cada vez, agregue el resultado a una lista

SELECT name
FROM my_table
where id = <anyId> // I use the id column for partitioning so I need this here
order by name
limit <pageSize * pageNumber>, 1

El número de página del seno no se conoce previamente, comience con el valor 0 y siga aumentando hasta que la consulta devuelva un valor nulo. También puede hacer un recuento seleccionado (*), pero eso en sí mismo puede llevar mucho tiempo y no ayudará a optimizar nada. Cada consulta tardó unos 2 segundos en ejecutarse una vez que el número de página superó las ~60.

Para mí, el tamaño de la página era 5000, así que obtuve una lista de cadenas de 'nombre' en la posición 0, 5001, 10001, 15001, etc. El número de páginas resultó ser 1000 y almacenar una lista de 1000 resultados en la memoria no es costoso.

Ahora, recorre la lista y ejecuta esta consulta

SELECT blobCol
FROM my_table
where name >= <pageHeader>
and name < <nextPageHeader>
and city="<any string>"
and id= 1

Esto se ejecutará N veces, donde N =tamaño de la lista obtenida previamente. Dado que 'nombre' es la columna de la clave principal y 'ciudad' también está indexada, EXPLAIN muestra que este cálculo se realiza en la memoria utilizando el índice.

Ahora, cada consulta tarda 1 segundo en ejecutarse, en lugar de los 30-40 originales. Entonces, al combinar el tiempo de preprocesamiento de 2 segundos por página, el tiempo total por página es de 3 a 4 segundos en lugar de 30 a 40.

Si alguien tiene una solución mejor o si hay algo claramente mal con esta, hágamelo saber