Ver Mensaje Individual
  #16 (permalink)  
Antiguo 13/05/2015, 07:52
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: consulta con limit es muy lenta

Meto la cuchara en el plato, para hacer una observación que hay que tener en cuenta...

Siendo que LIMIT apica sobre resultaod de la consulta, y a priori MySQL sólo sabe cual es el ultimo valor de ID de la tabla, pero no cuantos registors efectivamente existen en ella aún, el único camino que tiene apra realizar lecturas con saltos tan grandes es hacer un full table scan hasta encontrar los 99000 registros, para luego recuperar los 200 siguientes.
Ahora bien, además de esto, hay que tener en cuenta que un DBMS no "lee" los registros como una sola entidad continua de registros, sino que va almacenando grupos de registros en bloques de memoria que tienen un tamaño máximo. Mientras más registros deba leer, mas bloques deberá leer, escribir y descartar, con el aumento de accesos a datos y cambios de contexto del sistema. La consecuencia inmediata de eso es que un LIMIT como el descripto es por definición un espanto de performance.
Debe recordarse además que un bloque de datos se carga con registros íntegros, por lo que eventualmente puede haber desperdicio de memoria si la suma de bytes de lso registors deja espacio sin usar por ser menor a la longitud de un registro... Lo que empeora la situación en consultas de miles o millones de regstros.
Esto que digo, es, además, afectado por el buffer de consultas y las capacidades de red, que sin duda pueden verse ahogadas por consultas de mucho peso.
Esa es una de las razones por la que nunca se recomienda hacer consultas que generen reportes de semejante extensión, y también por qué existen herramientas específicas para construir reportes y listados.

En defnitiva, a menos que realices un filtrado sobre otros datos y columnas, las cuales conviene estén indexadas, esa consulta nunca funcionará en forma eficiente.
Podrás mejorar algunas configuraciones, e incluso usar otro hardware, pero siemrpe tendrás un piso de performance que no podrás bajar porque la misma consulta es ineficiente.

En la empresa que trabajo tenemos un caso semejante para ciertos listados que puede devolver cientos de miles de registros, y no se permiten realizar consultas en las aplicaciones, que abarquen la totalidad de resultados. Para esos casos, cuando iden algo de tanto impacto, se deriva al área de Bussines Intelligence, para que constuya los reporrtes con otras herramientas, ya que el SQL puro es insuficiente para tales necesidades.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 13/05/2015 a las 08:00