Ver Mensaje Individual
  #28 (permalink)  
Antiguo 14/05/2015, 03:16
primary
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 13 años, 3 meses
Puntos: 5
Respuesta: consulta con limit es muy lenta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Perdona que te lo diga así, pero tu duda carece de sentido. parece que no estás entendiendo como funciona el LIMIT, ni tampoco como opera el WHERE.

El LIMI aplica sobre el resultado final, es decir, sólo sobre los registros que cumplen con el WHERE, sin otras consideraciones. Esto último implica que el LIMIT sólo puede devovler los registros que NO están marcados como eliminados, y sólo cuenta ESOS.
Es imporsible para el LIMIT contar aquellos registros marcados como eliminados, porque la consulta NO LOS DEVUELVE. Es como si NO EXISTIERAN.

En los hechos, sólo podría devolverte en la segunda página un registro que muestra en la primera, si y sólo si en el interín entre ambas consutlas, alguien quitó la marca de eliminado de un registro que debía aparecer en el primer bloque. El corrimiento generado hacia adelante podría mover un registro de la primera a la segunda pagina, pero solo en ese contexto.
AL igual que en ese caso, si en el interín, otro usuario marca como eliminado un registro que aparecía en la primera página, se generará en la segunda ejecución un corrimietno igual hacia atrás, no mostrando un registro que antes era válido.
Este tipo de situaciones no son sencillas de resolver, pero sólo se producen en este contexto, y suelen ocurrir en sistemas concurrentes. Para evitarlos hay ciertas técnicas, como por ejemplo, tomar el mayor id recuperado del primer bloque y enviar a buscar los siguientes X registros posteriores a ese.
En estos casos, si, efectivamentye, la consulta necesita ser creada deforma dinámica, para agregar o quitar condiciones, según se necesite.
Pero la base de la query, no cambia.

¿Se entiende?
Hola gnzsoloyo tres cosas, primero agradecerte que sigas ayudandome, segundo no tienes que pedirme perdon ya que estoy aqui para aprender de los maestros y tres como novato que soy sigo teniendo dudas y la vuelvo a plantear.

Se como funciona el LIMIT es decir el paginador como lo tengo hasta ahora creado si son paginas de 200 registros cada una la primera pagina seria asi:

primera pagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE eliminado=0 LIMIT 0,200

segunda pagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE eliminado=0 LIMIT 200,200

decima pagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE eliminado=0 LIMIT 2000,200

De esta manera(que es como la tengo)funciona perfectamente el paginador ya que como dices afecta el LIMIT a los registros afectado tengan filtro o no, Pero mi problema era que si quiero ver una de las ultimas paginas el paginador se vuelve lento.

Entonce la solucion que me disteis fue esta consulta para pagina:

primera pagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE eliminado=0 AND id>0 LIMIT 200
o tambien asi:
Código MySQL:
Ver original
  1. SELECT * FROM empresa  WHERE eliminado=0 LIMIT 200

pero veo este problema, es decir en circunstancias normales la primera pagina me devolvera las filas con los id del 1 al 200 como ultimo id, quedando de esta forma la segunda pagina de paginacion:

segundapagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE id>200 LIMIT 200

seguiria funcionando bien el paginador en este caso la segunda pagina, pero que pasa si en la primera pagina tengo un registro eliminado por poner uno digamos el primero con id 1, el rango de id que me devolveria seria del 2 al 201 porque me devuelve siempre 200, entonces la segunda pagina que seria asi:

segundapagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE id>200 LIMIT 200

me devolveria el id 201 repetido, en definitiva se que el LIMIT devuelve solo filas afectadas pero al usar el WHERE id> para paginar esta el pequello conflicto de que el rango de id no es siempre el cuadrante, por eso insisto que si es buena idea crear dos consultas, una para saber cuantos id estan eliminados para luego añadirles al paginador, en este ejemplo teniendo un id eliminado en la primera pagina tendria que sumarle 1 a los 200 id del WHERE quedando asi:


segundapagina
Código MySQL:
Ver original
  1. SELECT * FROM empresa WHERE id>201 LIMIT 200
de esta forma me aseguro no repetir registros, bueno a la espera de las respuestas que estoy aqui para aprender, saludos.