2009-04-12 6 views
6

tener una enorme mesa de MySQL con como 300.000 registros y querían página de los registros en PHP (no es el punto aquí, sin embargo) con una consulta de esta manera:MySQL cuestiones de gran rendimiento mesa cuando la paginación con PHP

SELECT * FROM `table` LIMIT 250000, 100 

Podría ser muy lento en la última parte de los registros, especialmente cuando está cerca del final de la tabla (el LÍMITE comienza muy grande). ¿Supongo que MySQL tiene que contar hasta exactamente 250000 antes de sacarme los resultados?

Entonces, ¿cómo solucionar este o cualquier otro enfoque para paginación que podría ser mucho más rápido? ¡Gracias!

Respuesta

4

Asegúrese de estar utilizando un índice, de lo contrario, realizará un escaneo completo de la tabla. Puede consultar el plan de ejecución para verificar esto o forzar el problema utilizando una cláusula ORDER BY (en una columna indexada). Aquí está more information.

Su tabla no es tan grande en 300k filas. Sin embargo, hay problemas de rendimiento al acercarse al final de la mesa. La única solución real para esto es falsificar la cláusula de límite. Tiene un campo de incremento automático que numera las filas de 1 a 300,000 y luego lo hace:

SELECT * 
FROM mytable 
WHERE field BETWEEN 250000 and 250100 

o similar. Eso puede ser problemático o imposible si con frecuencia está eliminando filas, pero tiendo a encontrar que los datos más antiguos tienden a cambiar menos para que pueda optimizarlo usando LIMIT para las primeras 100.000 filas y la columna de paginación sustituta más allá de eso.

0

¿Esa es realmente toda la consulta, o también tiene una cláusula ORDER BY? Porque eso ralentizará las consultas de ese tipo severamente. Sin embargo, debería ayudar si puede obtener un índice del conjunto completo de cosas por las que está ordenando.

+0

Por favor, envíe mensajes como esto como un comentario, no una respuesta. Esta no es una respuesta. – Will

1

Tiene razón: MySQL tiene que escanear 250000 filas inútiles antes de leer las que desea. En realidad no hay solución para este ahorro dividir una tabla en varias queridos o tener un corte tales como:

SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1 
;or 
SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100 

Pero esto todavía no emula con precisión la función del operador LIMIT en consultas complejas. Es una velocidad: costo de oportunidad de funcionalidad.

0

Si usted tiene un campo de incremento automático, usted podría hacer:

SELECT * FROM table 
WHERE ID > @LastID 
ORDER BY ID 
LIMIT 100 
+0

Suponiendo que los datos nunca se eliminan, es decir. – ceejayoz

Cuestiones relacionadas