Foros del Web » Programando para Internet » PHP »

Agilizar consulta a mysql

Estas en el tema de Agilizar consulta a mysql en el foro de PHP en Foros del Web. Hola tengo tengo el siguiente código para hacer una consulta a dos tablas de mi BD mysql, tabla Trabajos y la otra historial, en trabajos ...
  #1 (permalink)  
Antiguo 04/10/2013, 07:54
 
Fecha de Ingreso: enero-2013
Mensajes: 22
Antigüedad: 11 años, 2 meses
Puntos: 0
Agilizar consulta a mysql

Hola tengo tengo el siguiente código para hacer una consulta a dos tablas de mi BD mysql, tabla Trabajos y la otra historial, en trabajos se guardan todos los trabajos requeridos en la otra almacena el historial de cada uno de estos trabajos,.
mi consulta llama el listado de trabajos "atrasados" y las últimas observaciones solo de estos. la consulta funciona bien pero demora mucho tiempo mas de un minuto.
Como puedo mejorar este código y obtener los mismos resultados en menos tiempo???
Ayuda por favor
Código PHP:
<?php require_once('../Connections/sicot.php'); ?>
<?php ini_set
('max_execution_time',9000); ?>

<?php
if (!function_exists("GetSQLValueString")) {
function 
GetSQLValueString($theValue$theType$theDefinedValue ""$theNotDefinedValue ""
{
  if (
PHP_VERSION 6) {
    
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch (
$theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
  }
  return 
$theValue;
}
}

mysql_select_db($database_sicot$sicot);
$query_atrazadas "SELECT hi.id_history , hi.id_trabajos , hi.observaciones , hi.fecha  FROM history_order hi INNER JOIN (SELECT MAX(fecha) TER, id_trabajos FROM history_order GROUP BY id_trabajos)t1 ON t1.id_trabajos = hi.id_trabajos AND  t1.TER = hi.fecha  INNER JOIN trabajos tjs ON tjs.id_trabajos = hi.id_trabajos WHERE tjs.condicion = '2' AND Fecha_entrega < '$por_hoy' AND NOT tjs.area = 'Ventas' 'Despacho' ORDER BY tjs.area DESC";
$atrazadas mysql_query($query_atrazadas$sicot) or die(mysql_error());
$row_atrazadas mysql_fetch_assoc($atrazadas);
$totalRows_atrazadas mysql_num_rows($atrazadas);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</style>
<style type="text/css">  
div#rounded-box2 {background:#ffffff;margin:0 auto;padding:0;width:1400px;border-radius:7px;-moz-border-radius: 7px; -webkit-border-radius : 7px; }  
div#rounded-box2 p {margin:0;padding:10px;color:#fff;}  
div#rounded-box3 {background:#ffffff;margin:0 auto;padding:0;width:775px;border-radius:7px;-moz-border-radius: 7px; -webkit-border-radius : 7px; }  
div#rounded-box3 p {margin:0;padding:10px;color:#fff;} 
#apDiv1 {
    position:absolute;
    left:570px;
    top:67px;
    width:28px;
    height:23px;
    z-index:1;
}
</style>
<style type="text/css" media="print">
.nover {display:none}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Informe General OT Atrasadas</title>
<link href="../css/TIENDA.CSS" rel="stylesheet" type="text/css" />
<script> 
function cerrarse(){ 
window.close() 

</script>
</head>

<body onload="window.print()"><div id="rounded-box2">
<table width="98%" border="0">
  <tr>
    <td align="right"><input type="button" value="Cerrar" class="nover" onclick="cerrarse()" /></td>
  </tr>
  <tr>
    <td align="center" class="titulo_GRANDE_NEGRO">Informe General OT Atrasadas</td>
  </tr>
  <tr>
    <td align="center" class="texto_descripcion_r" >Informe no incluye Ordenes de Trabajo al día y a 2 días de término</td>
  </tr>
  <tr>
    <td align="center" ><table width="98%" border="0">
      <tr class="texto-secciones">
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td align="right">&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
      <tr class="texto_descripcion_r">
        <td width="21%" align="right"><?php echo "$dia $dia2 de $mes de $ano";
?>&nbsp;&nbsp;&nbsp;</td>
        <td width="23%">Hora:&nbsp;
          <?php
date_default_timezone_set
("America/Santiago");
$hora time(); 
echo 
date ("H:i"$hora);
?></td>
        <td width="48%" align="right">Imprenta de la Armada</td>
        <td width="8%">&nbsp;</td>
      </tr>
      <tr class="texto-secciones">
        <td>&nbsp;</td>
        <td>&nbsp;</td>
        <td align="right">&nbsp;</td>
        <td>&nbsp;</td>
      </tr>
      <tr class="texto-secciones">
        <td colspan="4">&nbsp;</td>
      </tr>
    </table></td>
  </tr>
</table>
<p>&nbsp;</p>
<table width="1231" border="0" align="center" style="background-color:#CCC;">
  <tr class="texto_descripcion">
    <td align="center" scope="col"><div style="width:150px;">Nº OT</div></td>
    <td align="center" scope="col"><div style="width:170px;">Cliente</div></td>
    <td align="center" scope="col"><div style="width:170px;">Tipo de Trabajo</div></td>
    <td align="center" scope="col"><div style="width:96px;">Cantidad</div></td>
    <td align="center" scope="col"><div style="width:90px;">Total</div></td>
    <td align="center" scope="col"><div style="width:96px;"> Fecha Inicio</div></td>
    <td align="center" scope="col"><div style="width:96px;"> Fecha Entrega</div></td>
    <td align="center" scope="col"><div style="width:116px;">Área actual</div></td>
    <td align="center" scope="col"><div style="width:86px;">Estado</div></td>
    <td align="center" scope="col">Observaciones</td>
  </tr>

 <?php do { 
      if (
$colorfila==0){ 
       
$color"#FFFFFF"
       
$colorfila=1
    }else{ 
       
$color="#E8E8E8"
       
$colorfila=0
    } 
?>
    <tr bgcolor="<? echo $color;?>">
      <td width="244" height="40" align="center" valign="top" class="texto-precio-new"><?php echo $row_atrazadas['id_trabajos']; ?>/13</td>
      <td width="208" align="center" valign="top" class="texto_descripcion_r"><?php echo $row_atrazadas['rut_cliente']; ?><br />
        <br /> 
        <br /></td>
      <td width="134" align="center" valign="top" class="texto_descripcion_r"><?php echo $row_atrazadas['trabajo_1'].'<br />';
          if (
$row_atrazadas['trabajo_2']!= ""){
             echo 
$row_atrazadas['trabajo_2'].'<br />';}
           elseif (
$row_atrazadas['trabajo_3']!= ""){
             echo 
$row_atrazadas['trabajo_3'].'<br />';}
            elseif (
$row_atrazadas['trabajo_4']!= ""){
             echo 
$row_atrazadas['trabajo_4'].'<br />';}
            elseif (
$row_atrazadas['trabajo_5']!= ""){
             echo 
$row_atrazadas['trabajo_5'].'<br />';}
            elseif (
$row_atrazadas['trabajo_6']!= ""){
             echo 
$row_atrazadas['trabajo_6'].'<br />';}
             else{
                 }
?></td>
      <td width="145" align="center" valign="top" class="texto_descripcion_r"><?php echo $row_atrazadas['cantidad_1'].'<br />';
          if (
$row_atrazadas['cantidad_2']!= ""){
             echo 
$row_atrazadas['cantidad_2'].'<br />';}
           elseif (
$row_atrazadas['cantidad_3']!= ""){
             echo 
$row_atrazadas['cantidad_3'].'<br />';}
            elseif (
$row_atrazadas['cantidad_4']!= ""){
             echo 
$row_atrazadas['cantidad_4'].'<br />';}
            elseif (
$row_atrazadas['cantidad_5']!= ""){
             echo 
$row_atrazadas['cantidad_5'].'<br />';}
            elseif (
$row_atrazadas['cantidad_6']!= ""){
             echo 
$row_atrazadas['cantidad_6'].'<br />';}
             else{
                 }
?></td>
      <td width="74" align="center" valign="top" class="producto-descripcion">        <span class="texto_descripcion_r">
        <?php 
        
        $todo_ot 
$row_atrazadas['valor_6'] + $row_atrazadas['valor_5'] + $row_atrazadas['valor_4'] + $row_atrazadas['valor_3'] + $row_atrazadas['valor_2'] + + $row_atrazadas['valor_1']; 
        
$numero_entero $todo_ot;
        
number_format ($numero_entero 0",",".");
        
$finales number_format ($numero_entero ,0",",".");
        echo 
$finales?>      
      </span></td>
      <td width="101" align="center" valign="top" class="texto_descripcion_r"><span class="texto_descripcion">
        <?php 

   
    
//formato fecha americana
    
$fecha1=$row_atrazadas['fecha_inicio'];
    
$fecha2=date("d-m-Y",strtotime($fecha1));
    
$fecha_entre=$row_atrazadas['Fecha_entrega'];
    
$fecha_final=date("d-m-Y",strtotime($fecha_entre));
    
$nuevafecha strtotime '+1 day' strtotime $fecha1 ) ) ;
    
$nuevafecha date 'd-m-Y' $nuevafecha );
    
$para_viern strtotime '+3 day' strtotime $fecha1 ) ) ;
    
$para_vierndate 'd-m-Y' $para_viern );
    
$hora date("H:i:s",strtotime($fecha1));
    
$dia_fe date("l",strtotime($fecha1));


    if ((
$hora >= '14:00:00') && ($dia_fe == 'Friday')) { echo $para_viern;} elseif ($hora >= '14:00:00'){ echo $nuevafecha;} else {
    
//El nuevo valor de la variable: $fecha2="20-10-2008"
    
echo $fecha2; }
    
    
?>
      </span></td>
      <td width="56" align="center" valign="top" class="texto_descripcion_r"><?php echo $fecha_final?></td>
      <td width="109" align="center" valign="top" class="texto_descripcion_r"><?php echo $row_atrazadas['area']; ?></td>
      <td width="59" align="center" valign="top" class="texto_descripcion_r">
        <?php
        
echo '<img src="../images/red_light.png" width="28" height="26"/></br><span class="carro-total">ATRASADA</span>';
?>
      </td>
      <td width="59" align="center" valign="top" class="texto_descripcion_r"><?php echo $row_atrazadas['observaciones']; ?></td>
    </tr>
    <?php } while ($row_atrazadas mysql_fetch_assoc($atrazadas)); ?>

</table>
</div>
</body>
</html>
<?php
mysql_free_result
($atrazadas);
?>
Agradecere eternamente esta ayuda
  #2 (permalink)  
Antiguo 04/10/2013, 09:12
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Agilizar consulta a mysql

La verdad es que me sorprende que te funcione, habida cuenta que esa consulta contiene al menos un error de sintaxis...
Como sea, yo la plantearías así:
Código PHP:
$query_atrazadas "SELECT ";
$query_atrazadas .= "    hi.id_history, ";
$query_atrazadas .= "    hi.id_trabajos, ";
$query_atrazadas .= "    hi.observaciones, ";
$query_atrazadas .= "    hi.fecha  ";
$query_atrazadas .= "FROM history_order hi ";
$query_atrazadas .= "    INNER JOIN trabajos tjs ON tjs.id_trabajos = hi.id_trabajos ";
$query_atrazadas .= "WHERE ";
$query_atrazadas .= "    tjs.condicion = 2 ";
$query_atrazadas .= "    AND Fecha_entrega < '$por_hoy' ";
$query_atrazadas .= "    AND NOT tjs.area IN('Ventas', 'Despacho') ";
$query_atrazadas .= "    AND (hi.fecha, hi.id_trabajos) IN ";
$query_atrazadas .= "        (SELECT MAX(fecha) TER, id_trabajos ";
$query_atrazadas .= "        FROM history_order ";
$query_atrazadas .= "        GROUP BY id_trabajos) ";
$query_atrazadas .= "ORDER BY tjs.area DESC"
Estoy escribiendola en esa forma para que la sintaxis de la consulta pueda verse. Te recomiendo armar los scripts de un modo que sean más claros y fáciles de leer.
Fuera de esto, para optimizar el resultado sería conveniente que generes un índice sobre la columna "Fecha_entrega", para mejorar un poco la performance.

Consejo de experiencia: no hagas un Copy+Paste de este código. Verifica bien lo que puse antes de ejecutarlo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: php+bd+mysql
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 21:30.