Foros del Web » Programando para Internet » PHP »

problema con tablas, demasiados registros

Estas en el tema de problema con tablas, demasiados registros en el foro de PHP en Foros del Web. Hola Estoy volviendome loca, y lo peor es que no se si tendrá solución. Les cuento, tengo varias tablas, cada una de ellas de entre ...
  #1 (permalink)  
Antiguo 30/09/2010, 04:59
 
Fecha de Ingreso: abril-2005
Mensajes: 75
Antigüedad: 19 años
Puntos: 2
problema con tablas, demasiados registros

Hola

Estoy volviendome loca, y lo peor es que no se si tendrá solución.
Les cuento, tengo varias tablas, cada una de ellas de entre 300.000 y 600.000 registros.

Digamos que tengo una consulta fácil (tabla marcas, 60 o 70 registros) y por cada marca tengo que buscar la cantidad de resultados de las dos tablas grandes relacionadas entre si.
La funcion de php me deja colgado el pc entero. Desde phpmyadmin, 1 o 2 consultas me las busca, aunque un poco lento, pero si pongo el sql completo tambien se queda atascado. Por lo que creo que no son las consultas en sí.

Estoy buscando formas de optimizar la base de datos, las consultas y el php, pero no estoy consiguiendo nada.

Mi pregunta es: ¿Es posible gestionar desde php esa cantidad de registros?
Si creeis que es error de mis consultas, os mando el codigo que pidais.

Mil gracias
  #2 (permalink)  
Antiguo 30/09/2010, 05:07
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: problema con tablas, demasiados registros

Postea código pero te cuento un par de cosas:

1. Utiliza indices y claves foráneas.
2. Limita los LEFT JOIN
3. Utiliza LIMIT cada vez que puedas
4. Analiza tu select y evita las sub-selectes sobre tablas grandes.
5. Si utilizas AND y OR, atención a los ().

En cualquier caso, si se "cuelga" el pc será porque se cuelga MySQL server, no es habitual es una consulta. Creo que estás multiplicando los registros en la select.

Cuando puedas pon un ejemplo, salu2
  #3 (permalink)  
Antiguo 30/09/2010, 05:17
 
Fecha de Ingreso: abril-2005
Mensajes: 75
Antigüedad: 19 años
Puntos: 2
Respuesta: problema con tablas, demasiados registros

Esta es la tabla generica, y despues tendria que hacer más filtros.
Código PHP:
<?php
$sql_marcas
="select marca from marcas";
$result mysql_query($sql_marcas,$link) or die(mysql_error());
$num mysql_num_rows($result);
$j=0;
if (
$num>0)
{    while(
$j<$num)
    {    
$marca=mysql_result($result,$j,"marca");
        
        
$sql_num.="select COUNT(*) from caracteristicas as ci, productos as p
                 where ci.marca='$marca' and ci.cod_itv=p.cod_itv; "
;
        
$result_num mysql_query($sql_num,$link) or die(mysql_error());
        
$num_cantidad mysql_num_rows($result_num);

        
$tabla.="<tr><td>$marca</td>
                      <td>$num_cantidad</td></tr>"
;
        
        
$j++;
    }
}
?>
<table id="resultado">
<?php    echo $tabla;?>    
</table>
He realizado EXPLAIN de una consulta en phpmyadmin y me sale lo siguiente, pero no se qué significa exactamente:

Código SQL:
Ver original
  1. SELECT COUNT(*) FROM caracteristicas AS ci, productos AS p
  2.                  WHERE ci.marca='$marca' AND ci.cod_itv=p.cod_itv;

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ci ALL NULL NULL NULL NULL 186585 Using where
1 SIMPLE p ALL NULL NULL NULL NULL 290221 Using where

Sin explain, el count me da 523 registros.

Última edición por glome; 30/09/2010 a las 05:26
  #4 (permalink)  
Antiguo 30/09/2010, 05:30
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: problema con tablas, demasiados registros

Hay un par de concatenaciones .= que hacen que la select interior sea ilegible. También creo que el while($j<total) no termina nunca.
Me permito algunas modificaciones como ejemplo, modifica como quieras:

Código PHP:
<?php

$sql_marcas 
"select marca from marcas";
$result mysql_query($sql_marcas,$link) or die("Fallo en linea 4 ".mysql_error());
$num mysql_num_rows($result);

if (
$num)
{
    
$tabla "";
    while(
$datos mysql_fetch_assoc($result))
    {

        
$marca $datos["marca"];

        
$sql_num ="select COUNT(*) from caracteristicas as ci, productos as p
                 where ci.marca='"
.$marca."' and ci.cod_itv=p.cod_itv; ";

        
$result_num mysql_query($sql_num,$link) or die("Fallo en linea 18 ".mysql_error());
        
        
mysql_free_result($result_num);

        
$num_cantidad mysql_num_rows($result_num);

        
$tabla .="<tr><td>$marca</td><td>$num_cantidad</td></tr>";

    }
}
mysql_free_result($result);
?>
<table id="resultado"><?php echo $tabla;?></table>
A ver si marcha, un saludo
  #5 (permalink)  
Antiguo 30/09/2010, 06:00
 
Fecha de Ingreso: abril-2005
Mensajes: 75
Antigüedad: 19 años
Puntos: 2
Respuesta: problema con tablas, demasiados registros

Tarda demasiado, supera el limite de ejecución. Ahora mismo lo tengo en:
ini_set('max_execution_time','300');

Hay alguna forma de que vaya más rapido?
  #6 (permalink)  
Antiguo 30/09/2010, 06:30
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: problema con tablas, demasiados registros

Como te decía, estás haciendo una multiplicación, prueba esto:

Código PHP:
SELECT
  COUNT
(cod_itv)
FROM caracteristicas AS ci
  LEFT JOIN productos p ON 
(ci.cod_itv p.cod_itv)
WHERE ci.marca '".$marca."' 
Sin embargo, te en cuenta que el problema de los tiempos siempre esr elativo a la máquina.
Prueba esto a ver qué tal, salud2
  #7 (permalink)  
Antiguo 30/09/2010, 06:37
 
Fecha de Ingreso: abril-2005
Mensajes: 75
Antigüedad: 19 años
Puntos: 2
Respuesta: problema con tablas, demasiados registros

lo estoy probando en local, y si no va lo probare desde el servidor de internet. A ver que tal los tiempos.

Muchas gracias por todo

Etiquetas: registros, tablas
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 06:38.