Foros del Web » Programando para Internet » PHP »

Paginación de resultados MUY lenta

Estas en el tema de Paginación de resultados MUY lenta en el foro de PHP en Foros del Web. Hola a todos! Tengo una base de datos con 10.000 registros/productos. Armé las consultas, armé la paginación, el buscador funciona pero al momento de paginar ...
  #1 (permalink)  
Antiguo 12/12/2011, 18:37
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Paginación de resultados MUY lenta

Hola a todos! Tengo una base de datos con 10.000 registros/productos. Armé las consultas, armé la paginación, el buscador funciona pero al momento de paginar los resultados, cuando quiero pasar a la siguiente página se me cuelga la web completa , se tilda, se queda pensando y nada... hasta que por ahí, a los minutos pasa a la siguiente.

Les muestro como tengo armada la tabla productos y las consultas para que me digan que me falta o que estoy haciendo mal.

tabla producto


Consultas y Paginación
Código PHP:
ini_set("memory_limit","32M");

    include(
'conectar.php');

    
// conexion a la base
    
$conexion mysql_connect($host_db$usuario_db$pass_db) or die ("no se ha podido conectar a la BD");
    
mysql_select_db($base_db$conexion) or die ("no se ha podido seleccionar la BD");


// realizar esta función si se apretó el botón de enviar en el formulario de busqueda
if(isset($_GET['searchart']))

$select1 $_GET['select1'];
$select2 $_GET['select2'];
$select3 $_GET['select3'];
{

$condiciones "";
if (
$select1 != ""$condiciones .= " AND categoria.id_categoria = $select1";
if (
$select2 != "" && $condiciones != ""$condiciones .= " AND linea.id_linea = $select2";
if (
$select3 != "" && $condiciones != ""$condiciones .= " AND articulo.id_articulo = $select3";

$res mysql_query("SELECT * FROM producto, categoria, linea, articulo WHERE producto.cod_categoria = categoria.cod_categoria AND producto.cod_linea = linea.cod_linea AND producto.cod_articulo = articulo.cod_articulo $condiciones ORDER BY producto.cod_linea"); 

$numeroRegistros mysql_num_rows($res);

$tamPag=10;

//pagina actual si no esta definida y limites 
if(!isset($_GET["pagina"])) 

$pagina=1
$inicio=1
$final=$tamPag
}else{ 
$pagina $_GET["pagina"]; 

//calculo del limite inferior 
$limitInf=($pagina-1)*$tamPag

//calculo del numero de paginas 
$numPags=ceil($numeroRegistros/$tamPag); 
if(!isset(
$pagina)) 

$pagina=1
$inicio=1
$final=$tamPag
}else{ 
$seccionActual=intval(($pagina-1)/$tamPag); 
$inicio=($seccionActual*$tamPag)+1

if(
$pagina<$numPags

$final=$inicio+$tamPag-1
}else{ 
$final=$numPags


if (
$final>$numPags){ 
$final=$numPags



$res mysql_query("SELECT * FROM producto, categoria, linea, articulo WHERE producto.cod_categoria = categoria.cod_categoria AND producto.cod_linea = linea.cod_linea AND producto.cod_articulo = articulo.cod_articulo $condiciones ORDER BY producto.cod_linea LIMIT ".$limitInf.", 16"); 

//muestro los resultados...

//Paginacion

if($pagina>1

echo 
"<a class='txtPaginador11b' href='".$_SERVER["PHP_SELF"]."?pagina=".($pagina-1)."&orden=".$orden."&select1=".$select1."&select2=".$select2."&select3=".$select3."'>"
echo 
"<class='txtPaginador11b'><< ANTERIOR</font>"
echo 
"</a>*"


for(
$i=$inicio;$i<=$final;$i++) 

if(
$i==$pagina

echo 
"<class='txtPaginador11b'><b>".$i." </b>"
}else{ 
echo 
"<a class='txtPaginador11b' href='".$_SERVER["PHP_SELF"]."?pagina=".$i."&orden=".$orden."&select1=".$select1."&select2=".$select2."&select3=".$select3."'>"
echo 
"<class='txtPaginador11b'>".$i."</a>*"


if(
$pagina<$numPags

echo 
"*<a class='txtPaginador11b' href='" .$_SERVER["PHP_SELF"]. "?pagina=" .($pagina+1). "&orden=".$orden."&select1=".$select1."&select2=".$select2."&select3=".$select3."'>"
echo 
"<class='txtPaginador11b'>SIGUIENTE >></a>"

echo 
"<div id='total_paginador'><font face='verdana' size='-2'>Total: ".$numeroRegistros." resultados</div>";

// Cierro la conexion
mysql_close($conexion); 
Tengo el mismo estilo de buscador pero preparado para buscar por palabras y le pasa exactamente lo mismo... TARDA UNA ETERNIDAD en pasar de página.

¿Me pueden decir por favor por qué pasa esto?

Desde ya espero puedan darme una mano porque me lo están reclamando y no sé que hacer para solucionarlo.

Muchas gracias y saludos.

Marx.

Les dejo para que vean y lo prueben si es que quieren en la demo de la web que estoy terminando. El código de arriba pertenece a "busqueda con filtros":
http://www.pizzutoautopartes.com.ar/demo/index.php
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #2 (permalink)  
Antiguo 12/12/2011, 19:00
 
Fecha de Ingreso: julio-2010
Mensajes: 393
Antigüedad: 14 años, 3 meses
Puntos: 67
Respuesta: Paginación de resultados MUY lenta

Primero, estás seguro que son las consultas? pueba copiando y pengando tus consultas en el phpmyadmin cambiando el número de página (simulando la paginación).

Es raro que tarde tanto, te sugiero que crees indices para los campos

id_categoria
id_linea
id_articulo

pruebalo y comenta que tal te fué
de paso te invito a que pruebes esta paginación php.

Saludos!
__________________
Páginas web de alta calidad y hechas a la medida.
  #3 (permalink)  
Antiguo 13/12/2011, 05:59
 
Fecha de Ingreso: diciembre-2011
Mensajes: 4
Antigüedad: 12 años, 11 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

1 - Haz un echo de las consultas
2 - Vete a PHPMyAdmin y les metes "EXPLAIN" delante para que te explique por qué está tardando
3 - Rehaz la consulta usando JOINs, es mucho más eficaz.

Para la paginación, no hagas la misma consulta dos veces. Mira la información sobre SQL_CALC_FOUND_ROWS
  #4 (permalink)  
Antiguo 14/12/2011, 09:20
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por el_quick Ver Mensaje
Primero, estás seguro que son las consultas? pueba copiando y pengando tus consultas en el phpmyadmin cambiando el número de página (simulando la paginación).

Es raro que tarde tanto, te sugiero que crees indices para los campos

id_categoria
id_linea
id_articulo

Saludos!
¿Los índices deberían quedar así en el phpmyadmin, en cada tabla correspondientes a los id que me dices? ¿No llevan clave primaria?

Tabla artículos
Nombre de la clave Tipo Único Empacado Campo
id_articulo BTREE No No id_articulo

Cita:
2 - Vete a PHPMyAdmin y les metes "EXPLAIN" delante para que te explique por qué está tardando
Esto, donde lo coloco?

Cita:
Para la paginación, no hagas la misma consulta dos veces.
¿Puede ser esta la causa también?

Muchas gracias por sus consejos. Espero solucionarlo porque me estoy volviendo loco.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #5 (permalink)  
Antiguo 14/12/2011, 09:44
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 4 meses
Puntos: 194
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por carlitusmm Ver Mensaje
3 - Rehaz la consulta usando JOINs, es mucho más eficaz.
Esto es mentira, los JOINS implícitos son igual de eficaces que los explícitos. Es solo una cuestión de gustos, esto se comprueba haciendo un simple benchmark. Yo por ejemplo Siempre trato de utilizar Implícitos en el where.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 14/12/2011, 18:28
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

mmmm... no sé que pasa... probé con el paginador de este post y tampoco pasa a la siguiente página. http://www.forosdelweb.com/f18/pagin...ltados-143748/

Código PHP:
if (!isset($_GET['pg'])){
    
$pg 1// $pg es la pagina actual
}else{
    
$pg=$_GET['pg'];
}
$cantidad=16// cantidad de resultados por página
$inicial = ($pg-1) * $cantidad;

if(isset(
$_GET['searchart']))

// declarar variables los datos del formulario
$select1 $_GET['select1'];
{

// declarar las condiciones usando la opci&oacute;n WHERE, dependiendo de lo enviado en el formulario
$condiciones "";
if (
$select1 != ""$condiciones .= " AND categoria.id_categoria = $select1";
if (
$select2 != "" && $condiciones != ""$condiciones .= " AND linea.id_linea = $select2";
if (
$select3 != "" && $condiciones != ""$condiciones .= " AND articulo.id_articulo = $select3";

$pegar "SELECT * FROM producto, categoria, linea, articulo WHERE producto.cod_categoria = categoria.cod_categoria AND producto.cod_linea = linea.cod_linea AND producto.cod_articulo = articulo.cod_articulo $condiciones ORDER BY producto.cod_linea LIMIT $inicial,$cantidad";
$cad mysql_query($pegar) or die (mysql_error());

$contar "SELECT * FROM producto, categoria, linea, articulo WHERE producto.cod_categoria = categoria.cod_categoria AND producto.cod_linea = linea.cod_linea AND producto.cod_articulo = articulo.cod_articulo $condiciones ORDER BY producto.cod_linea"
$contarokmysql_query($contar);
$total_records mysql_num_rows($contarok);
$pages ceil($total_records $cantidad); 
Código PHP:
if ($pg <> 1){
    
$url $pg 1;
    echo 
"<a href='paginar.php?pg=".$url."'>&laquo; Anterior</a>&nbsp;";
}else {
    echo 
" ";
}

for (
$i 1$i<=$pages$i++) {
    if (
$i == $pg) {
        echo 
"<font face=Arial size=2 color=ff0000><b>&nbsp;$i&nbsp;</b></font>";
    }else{
        echo 
"<a href='".$_SERVER['PHP_SELF']."?pg=".$i."'>".$i."</a>&nbsp;";
    }
}

if (
$pg $pages) {
    
$url $pg 1;
    echo 
"<a href='".$_SERVER['PHP_SELF']."?pg=".$url."'>Siguiente &raquo;</a>";
}else {
    echo 
" ";

No me tira ningún error en las consultas, solo uno que dice "Fatal error: Maximum execution time of 30 seconds exceeded "

¿Alguna otra sugerencia de que puede ser el problema?
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #7 (permalink)  
Antiguo 14/12/2011, 18:51
 
Fecha de Ingreso: julio-2010
Mensajes: 393
Antigüedad: 14 años, 3 meses
Puntos: 67
Respuesta: Paginación de resultados MUY lenta

Ya estás seguro que son las consultas?
también puedes probar con esta paginación php
__________________
Páginas web de alta calidad y hechas a la medida.
  #8 (permalink)  
Antiguo 15/12/2011, 04:26
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por el_quick Ver Mensaje
Ya estás seguro que son las consultas?
también puedes probar con esta paginación php
el_quick: gracias por responder. Si, esas son las consultas y offline me funcionan y en mi servidor de prueba la paginación que puse arriba de todo va de primera, la otra que probé tarda un monton y todavía no probé la que tu me pasaste.

Esas consultas trabajan con otras 3 tablas. Todas están relacionadas. Lo raro que te comentaba, es que offline el paginador funciona rápido, tardará 2 ó 3 segundos en cambiar de página pero cuando lo subo a mi servidor en internet, el buscador devuelve rápido los resultados pero al paginar, al querer pasar a la página siguiente se queda pensando y pasado unos minutos recién cambia de página.
Lo que noté también que tarda cuando los resultados de una consulta tiene que mostrar muchos resultados. Si el total de lo que devuelve son pocas páginas es bastante rápido pero si el total de páginas son por ejemplo, 10 páginas, ahí pasa lo que les comentaba... se vuelve muy lento todo.

Por eso preguntaba si hay algo que debo modificar en las tablas en el phpmyadmin, por ahí es ese el problema ó quizás debería reveer el paginador... no sé, no sé si será eso.

Voy a seguir probando... gracias por todo.

Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #9 (permalink)  
Antiguo 15/12/2011, 06:37
Avatar de qvixote  
Fecha de Ingreso: marzo-2008
Mensajes: 79
Antigüedad: 16 años, 8 meses
Puntos: 2
Respuesta: Paginación de resultados MUY lenta

Veo que para contar la cantidad de registros haces un SELECT que obtiene todos los campos, cosa que podrías reemplazar por algo así como:

Código:
SELECT COUNT(*) FROM ...
Aunque no estoy seguro que sea más rápido.
  #10 (permalink)  
Antiguo 15/12/2011, 08:26
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Paginación de resultados MUY lenta

Me da Error 503 tu pagina web

Edito: Solo la carpeta demo

salu2
  #11 (permalink)  
Antiguo 15/12/2011, 10:42
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Paginación de resultados MUY lenta

divide la tabla podria ser no?por probar
  #12 (permalink)  
Antiguo 15/12/2011, 10:43
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Paginación de resultados MUY lenta

¿Que hostings usas? que especificaciones ?

Saludos
  #13 (permalink)  
Antiguo 15/12/2011, 12:49
 
Fecha de Ingreso: julio-2010
Mensajes: 393
Antigüedad: 14 años, 3 meses
Puntos: 67
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por qvixote Ver Mensaje
Veo que para contar la cantidad de registros haces un SELECT que obtiene todos los campos, cosa que podrías reemplazar por algo así como:

Código:
SELECT COUNT(*) FROM ...
Aunque no estoy seguro que sea más rápido.
Es más rápido * que especificar campos, mysql primero busca * (todo) y comienza a seleccionar dentro de * cada uno de los campos específicados.

Saludos!
__________________
Páginas web de alta calidad y hechas a la medida.
  #14 (permalink)  
Antiguo 15/12/2011, 14:57
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por marcofbb Ver Mensaje
¿Que hostings usas? que especificaciones ?

Saludos
El hosting de mi cliente es http://www.mardelhosting.net/ y el plan es el Pro.

Increible... no? Y eso que tiene una BDD chica... 10000 no es tanto comparado a otras webs.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #15 (permalink)  
Antiguo 15/12/2011, 15:53
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por marx-pola Ver Mensaje
El hosting de mi cliente es http://www.mardelhosting.net/ y el plan es el Pro.

Increible... no? Y eso que tiene una BDD chica... 10000 no es tanto comparado a otras webs.
Mandaste soporte a ellos ?
  #16 (permalink)  
Antiguo 16/12/2011, 05:14
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por marcofbb Ver Mensaje
Mandaste soporte a ellos ?
No, todavía no pero lo probé en otro servidor pago que tengo y pasa exactamente lo mismo.
Entonces es evidente que tiene que ser un problema en las consultas ó en "algo" que me falta en las tablas del phpmyadmin. Algo debo de tener mla armado o configurado porque no puede ser que en 2 servidores suceda lo mismo.

Offline funciona perfecto... online se viene todo abajo.

No lo puedo creer...
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #17 (permalink)  
Antiguo 16/12/2011, 14:18
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por marx-pola Ver Mensaje
No, todavía no pero lo probé en otro servidor pago que tengo y pasa exactamente lo mismo.
Entonces es evidente que tiene que ser un problema en las consultas ó en "algo" que me falta en las tablas del phpmyadmin. Algo debo de tener mla armado o configurado porque no puede ser que en 2 servidores suceda lo mismo.

Offline funciona perfecto... online se viene todo abajo.

No lo puedo creer...
Y si de alguna forma cacheas la paginacion ?
  #18 (permalink)  
Antiguo 16/12/2011, 17:05
Avatar de truman_truman  
Fecha de Ingreso: febrero-2010
Ubicación: /home/user
Mensajes: 1.341
Antigüedad: 14 años, 9 meses
Puntos: 177
Respuesta: Paginación de resultados MUY lenta

Por favor meté todo esto

SELECT * FROM producto, categoria, linea, articulo WHERE producto.cod_categoria = categoria.cod_categoria AND producto.cod_linea = linea.cod_linea AND producto.cod_articulo = articulo.cod_articulo $condiciones ORDER BY producto.cod_linea

en una variable $sql

luego hazle un echo $qsl; exit; , copiá el código y pegalo acá
__________________
la la la
  #19 (permalink)  
Antiguo 19/12/2011, 16:27
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Hola a todos! Encontré cual era el problema...

En el paginador estaba la variable &orden=".$orden." que en algún momento coloqué y me olvidé de sacarla.

Usé el mismo código que puse al principio y el paginador quedó de esta manera:

Código PHP:
if($pagina>1)
$select1 $_GET['select1'];
$select2 $_GET['select2'];
$select3 $_GET['select3']; 
{
echo 
"<a class='txtPaginador11b' href='".$_SERVER["PHP_SELF"]."?pagina=".($pagina-1)."&txt_criterio=".$txt_criterio."&buscar=>>'>"
echo 
"<a class='txtPaginador11b' href='".$_SERVER["PHP_SELF"]."?pagina=".($pagina-1)."&select1=".$select1."&select2=".$select2."&select3=".$select3."&searchart=buscar'>"
echo 
"<class='txtPaginador11b'><< ANTERIOR</font>"
echo 
"</a>*"


for(
$i=$inicio;$i<=$final;$i++) 

if(
$i==$pagina

echo 
"<class='txtPaginador11b'><b>".$i." </b>"
}else{ 
echo 
"<a class='txtPaginador11b' href='".$_SERVER["PHP_SELF"]."?pagina=".$i."&select1=".$select1."&select2=".$select2."&select3=".$select3."&searchart=buscar'>"
echo 
"<class='txtPaginador11b'>".$i."</a>*"


if(
$pagina<$numPags

echo 
"*<a class='txtPaginador11b' href='" .$_SERVER["PHP_SELF"]."?pagina=".($pagina+1)."&select1=".$select1."&select2=".$select2."&select3=".$select3."&searchart=buscar'>"
echo 
"<class='txtPaginador11b'>SIGUIENTE >></a>"

echo 
"<div id='total_paginador'><font face='verdana' size='-2'>Total: ".$numeroRegistros." resultados</div>";

mysql_close($conexion); 
...y voilá... FUNCIONÓ y ahora sí pagina rápido!!!

Gracias por todo y por su tiempo para atender mi duda.

Abrazo grande y saludos.

Marx.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.
  #20 (permalink)  
Antiguo 19/12/2011, 16:32
 
Fecha de Ingreso: julio-2010
Mensajes: 393
Antigüedad: 14 años, 3 meses
Puntos: 67
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por el_quick Ver Mensaje
Ya estás seguro que son las consultas?
también puedes probar con esta paginación php
:/ No pusiste atención !!!

Ok, me alegro que todo esté bien ahora!!!
__________________
Páginas web de alta calidad y hechas a la medida.
  #21 (permalink)  
Antiguo 19/12/2011, 16:35
 
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 630
Antigüedad: 22 años, 6 meses
Puntos: 1
Respuesta: Paginación de resultados MUY lenta

Cita:
Iniciado por el_quick Ver Mensaje
:/ No pusiste atención !!!

Ok, me alegro que todo esté bien ahora!!!
No... debo reconocer que me ganaron los nervios ... pero uds. comprenderán seguramente.
Gracias nuevamente.
__________________
"Todo lo que somos es el resultado de lo que hemos pensado". Budda.

Etiquetas: formulario, lenta, mysql, registro, resultados, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:42.