Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Queries que generan sobrecarga

Estas en el tema de Queries que generan sobrecarga en el foro de Mysql en Foros del Web. Hola a todos. Gracias a este foro fuí creando mi sitio web que es un directorio con casi 2 millones de filas, 69 tablas, pesa ...
  #1 (permalink)  
Antiguo 25/02/2012, 19:46
 
Fecha de Ingreso: febrero-2004
Mensajes: 143
Antigüedad: 20 años, 2 meses
Puntos: 2
Queries que generan sobrecarga

Hola a todos. Gracias a este foro fuí creando mi sitio web que es un directorio con casi 2 millones de filas, 69 tablas, pesa 350 MB y recibe 15.000 visitas al día

Lamentablemente por lo visto no lo hice bien, y mi hosting bloqueó mi base de datos por una constante llamada a la base de datos.

Cada página tiene los SELECT que coloco a continuación, y quisiera ver si es posible resumir eso en menos SELECT o llamadas. Si necesitan otra parte del código o algo de la base de datos, diganme que se necesita y lo pego aquí.

1)
Código PHP:
$datosempresaaa = @mysql_fetch_array(mysql_query("SELECT * FROM peru_export NATURAL LEFT JOIN peru_export_partida LEFT OUTER JOIN peru_empresas ON peru_export.ruc = peru_empresas.ruc_nvo WHERE id='".$ttempresaid."' limit 1"));] 
2)
Código PHP:
$result mysql_query("SELECT * FROM peru WHERE empresa LIKE '%$empresa_operativa%' ORDER BY id ASC LIMIT 1"$con); 
if (
$row mysql_fetch_array($result)){ 

while (
$field mysql_fetch_field($result)){ 

do { 
echo 
"Exportaciones <a href=\"".limpiaurl($datosempresaaa['empresa'])."-peru".$headers_idioma['lenguaje']."-".$row["id"].".php\">Importaciones </a>";
      } while (
$row mysql_fetch_array($result)); } else { 
echo 
"¡ No se encontraron registros de importaciones !"



3)
Código PHP:
$tabla mysql_query("SELECT DISTINCT * FROM peru_export_partida LEFT OUTER JOIN ncm_4_dig ON peru_export_partida.partida = ncm_4_dig.ncm WHERE ruc='$ruc' LIMIT 3");
while (
$registro mysql_fetch_array($tabla)) { 
echo 
''.$registro['partida'].' '.$registro['cap'].' '.$registro['desc'].'<br>
'
;

4)
Código PHP:
$tabla mysql_query("SELECT DISTINCT * FROM peru_export NATURAL JOIN peru_export_partida WHERE partida='$headers_partida' LIMIT 3");
while (
$registro mysql_fetch_array($tabla)) { 
    
$headers_empresa $registro['empresa'];

echo 
"<a class='linkrelacionados' href=\"".limpiaurl($registro['empresa']).$headers_pais.$headers_idioma['lenguaje']."-".$registro["id"].".php\">\n$headers_empresa - 
</a>"
;
}
mysql_free_result($tabla);
mysql_close($con); 
5)
Código PHP:

$_pagi_sql 
"SELECT * FROM peru_export";
$_pagi_cuantos 10;
$_pagi_nav_num_enlaces 5;
$_pagi_mostrar_errores false;
$_pagi_conteo_alternativo true;
$_pagi_propagar = array("id","termino");
$_pagi_nav_estilo "nav";
$_pagi_nav_anterior "Anterior";
if (
$_pagi_actual $_pagi_totalPags){

$_pagi_url $_pagi_actual 1;

$_pagi_navegacion_temporal[] = "<a ".$_pagi_nav_estilo_mod2." href='".$_pagi_enlace."_pagi_pg=".$_pagi_url."'>$_ pagi_nav_siguiente</a>";

$_pagi_url $_pagi_totalPags;

$_pagi_navegacion_temporal[] = "<a ".$_pagi_nav_estilo_mod2." href='".$_pagi_enlace."_pagi_pg=".$_pagi_url."'>$_ pagi_nav_ultima</a>";
}
include(
"../paginator.inc.php");
while(
$row mysql_fetch_array($_pagi_result)){
    echo 
"<ul><li class='ListBox'><h2>&nbsp;<a href=\"".limpiaurl($row['empresa']).$urltoentrerprise.$row['id'].".php\">".$row['empresa']."</a></h2></li></ul>";
}
echo
".$_pagi_navegacion."
Los NATURAL JOIN, LEFT OUTER JOIN y otros los puse así porque de lo contrario no me funcionaba bien.

Hay algún consejo que puedan darme??.

Desde ya agradezco mucho su ayuda
Marcelo
  #2 (permalink)  
Antiguo 25/02/2012, 20:18
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: Queries que generan sobrecarga

Bueno, la segunda consulta tiene una condición muy usada, pero extremadamente ineficiente.
Cuando usas LIKE, se busca por similitud; se busca un conjunto de letras precedido o seguido por cualquier otra cosa que contenga, o nada. Para eso es que se usa el comodín (%).
Pero cuando pones
Código SQL:
Ver original
  1. campo LIKE '%textobuscado%'
esa condición implica que busque lo que comience y termine con cualquier cosa... En los hechos hace un table scanning, que significa que leerá toda la tabla. Completa. Todos los registros, revisando uno por uno, porque no puede discriminar nada.
Es la peor situación de una consulta. Como dije, es una forma muy usada, pero no por eso es mejor. Todo lo contrario.
Es la peor lectura posible.
Antes de usar eso es preferible hacer un
Código SQL:
Ver original
  1. (campo LIKE 'textobuscado%' OR campo LIKE '%textobuscado'
ya que a pesar de ser semánticamente similares, tienden a ser más rápidos, ya que descarta todo lo que no comience o termine con lo buscado, lo que será la mayoría. Ten en cuenta que la gente suele escribir el comienzo del texto buscado, y no la mitad del texto (Si buscas Ciudad del Cabo, es muy probable que escribas "Ciudad del" o "del Cabo" y no "dad del C")
Y para el caso de textos intermedios, incluso, es preferible usar MATCH(...) AGAINST(...), e índices FULLTEXT. Son más eficientes.

Por otro lado, y respecto a NATURAL JOIN y LEFT OUTER JOIN; es mejor referirte al manual oficial del tema:
Cita:
La sintaxis { OJ ... LEFT OUTER JOIN ...} ...existe sólo por compatibilidad con ODBC.
Cita:
El NATURAL [LEFT] JOIN de dos tablas se define semánticamente equivalente a un INNER JOIN o LEFT JOIN con una cláusula USING que nombra todas las columnas que existen en ambas tablas.
En otras palabras, aunque soporta la sintaxis de ambas, en realidad internamente operan igual que usar INNER JOIN y LEFT JOIN, sin ninguna ventaja adicional.
En el caso de LEFT JOIN, lo que debes recordar es que la tabla izquierda debe ser siempre la tabla primaria de los datos que buscas, y no la tabla secundaria.
Esto significa que si lo que quieres es, por ejemplo, las exportaciones discriminadas por empresa, la tabla izquierda debe tener la lista de empresas y la derecha la lista de productos exportados. ¿Se entiende? Hacerlo al revés haría que el resultado del LEFT JOIN fuese igual al de un INNER JOIN.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 07/03/2012, 09:37
 
Fecha de Ingreso: febrero-2004
Mensajes: 143
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Queries que generan sobrecarga

Muchas gracias gnzsoloyo.
Disculpas por la demora en responder. Recién estoy regresando de las vacaciones.

Sobre los que comentas de modificar el LIKE, lo acabé resolviendo de la siguiente forma "campo='textobuscado'", ya que no era algo que llamaba desde la base de datos y si un string que tenía en el código HTML.

Ahora, no me funciona lo que comentas de reemplazar NATURAL LEFT JOIN por INNER JOIN o LEFT JOIN. INNER JOIN no me muestra todos los registros (solo el primero), y LEFT JOIN no carga la página

Abrazos

Última edición por Lordseed; 07/03/2012 a las 10:12
  #4 (permalink)  
Antiguo 07/03/2012, 10:58
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: Queries que generan sobrecarga

Cita:
Ahora, no me funciona lo que comentas de reemplazar NATURAL LEFT JOIN por INNER JOIN o LEFT JOIN. INNER JOIN no me muestra todos los registros (solo el primero), y LEFT JOIN no carga la página
Postea la sentencia completa que usas (no PHP, por favor) y veremos lo que está pasando.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/03/2012, 11:12
 
Fecha de Ingreso: febrero-2004
Mensajes: 143
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Queries que generan sobrecarga

Gracias nuevamente por tu rápida respuesta. Como no se bien a que te refieres con sentencia, coloco el código HTML, y los principales includes llamados desde este. Si falta o sobra algún dato dime y lo agrego/retiro:

Código HTML:
<?
include("tconfig.php");
require_once('../script/phpSEO.php');

$ttpais = "peru";
$ttidioma = "";


$headers_default['description'] = "Importadores en Per&uacute;, con los datos de contacto";
$headers_default['keywords'] = "importadores,exportadores,industrias,estadisticas,aduanas,operaciones,movimientos,";
$headers_default['lenguaje'] = "es";
$headers_default['nombre_seccion'] = "Importadores en Per&uacute;";
$headers_idioma_eng['lenguaje'] = "-eng-";
$headers_idioma_pt['lenguaje'] = "-pt-";
$headers_idioma_esp['lenguaje'] = "-";
$headers_pais = "-".$ttpais;
$menu_operativa = "Importadores en ";
$descripcion_operativa = "Importaciones";
$headers_default['template_description'] = "%empresa_nombre% %empresa_ruc% es una empresa de Per&uacute;. Direcci&oacute;n %empresa_direccion% %empresa_ciudad% y tel&eacute;fono %empresa_telefono%";
$headers_default['template_keywords'] = "%empresa_nombre%, empresas en Per&uacute;, %empresa_nombre% Per&uacute;, importacion";

....

if(empty($ttidioma)){ $urltoentrerprise = "-".$ttpais."-"; }else{ $urltoentrerprise = "-".$ttpais."-".$ttidioma."-"; }

if(is_numeric($ttempresaid)){
   $datosempresaaa = @mysql_fetch_array(mysql_query("SELECT * FROM peru NATURAL LEFT JOIN peru_import_partida LEFT OUTER JOIN peru_empresas ON peru.ruc = peru_empresas.ruc_nvo WHERE id='".$ttempresaid."' limit 1"));
   $datosempresaaa = preg_replace('/(www.comxport.com)/','www.',$datosempresaaa);
   $datosempresaaa = preg_replace('/䱉 䵁/','',$datosempresaaa);
   if(is_array($datosempresaaa)){
    $headers_default['nombre_seccion'] = $datosempresaaa['empresa'];
    $headers_default['direccion_nvo'] = $datosempresaaa['direccion_nvo'];
	$headers_pais2 = "Perú";
	$headers_actividad = "<a href='../mas_paises.html' target='_blank' class='linkcondiciones'>Importaciones.</a>";		
     
  $titulo_documento = $datosempresaaa['empresa']."  ";
$headers_default['description'] = str_ireplace("%empresa_nombre%",$datosempresaaa['empresa'],$headers_default['template_description']);$headers_default['description'] = str_ireplace("%empresa_pais%",$headers_pais2,$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_telefono%",$datosempresaaa['telefono_nvo'],$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_direccion%",$datosempresaaa['direccion'],$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_ruc%",$datosempresaaa['ruc'],$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_ciudad%",$datosempresaaa['ciudad'],$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_operacion%",$descripcion_operativa,$headers_default['description']);
$headers_default['description'] = str_ireplace("%empresa_operacion%",$descripcion_operativa,$headers_default['description']);
$headers_default['keywords'] = str_ireplace("%empresa_pais%",$headers_pais2,$headers_default['keywords']);
$headers_default['keywords'] = str_ireplace("%empresa_telefono%",$datosempresaaa['telefono_nvo'],$headers_default['keywords']);
$headers_default['keywords'] = str_ireplace("%empresa_direccion%",$datosempresaaa['direccion_nvo'],$headers_default['keywords']);
$headers_default['keywords'] = str_ireplace("%empresa_operacion%",$descripcion_operativa,$headers_default['keywords']);
	$empresa_operativa = $datosempresaaa['empresa'];
	$ruc = $datosempresaaa['ruc'];
	$headers_rubro = $datosempresaaa['rubro'];		
	$headers_contacto = ", contacto";		
	$headers_partida = $datosempresaaa['partida'];
	$headers_rubcompleto = "<a href=\"".limpiaurl($datosempresaaa['empresa']).$headers_pais."_full".$headers_idioma['lenguaje']."-".$datosempresaaa['id'].".php\">mas... </a>";	
ob_start(); // start buffering php output
include('actividades/peru_partida_import.php'); // output from child.php is buffered
$string = ob_get_contents(); // ob_get_content contains the buffered php output
ob_end_clean(); // remove the buffered php output

$seo = new phpSEO($headers_rubro);
$html_keywords.="$empresa_operativa, ". $seo->getKeyWords(10);
$html_description= $seo->getMetaDescription(160);
unset($seo);

   }
}
?>
.....
<head>
<title><?=$titulo_documento?>Importadores en Per&uacute; | Inteligencia competitiva</title>
.....
<? if(!empty($datosempresaaa['empresa'])){?><?php include('../includes/datos_esp.html'); ?><? } ?>.....
<? if(empty($datosempresaaa['empresa'])){?>
        <tr valign="top">
			<td colspan="3" align="left">
<!-- LISTADO EMPRESAS -->
<div class"listado"><?php


$_pagi_sql = "SELECT * FROM peru";
$_pagi_cuantos = 10;
$_pagi_nav_num_enlaces = 5;
$_pagi_mostrar_errores = false;
$_pagi_conteo_alternativo = true;
$_pagi_propagar = array("id","termino");
$_pagi_nav_estilo = "nav";
$_pagi_nav_anterior = "Anterior";
if ($_pagi_actual < $_pagi_totalPags){

$_pagi_url = $_pagi_actual + 1;

$_pagi_navegacion_temporal[] = "<a ".$_pagi_nav_estilo_mod2." href='".$_pagi_enlace."_pagi_pg=".$_pagi_url."'>$_ pagi_nav_siguiente</a>";

$_pagi_url = $_pagi_totalPags;

$_pagi_navegacion_temporal[] = "<a ".$_pagi_nav_estilo_mod2." href='".$_pagi_enlace."_pagi_pg=".$_pagi_url."'>$_ pagi_nav_ultima</a>";
}
include("../paginator.inc.php");
while($row = mysql_fetch_array($_pagi_result)){
    echo "<ul><li class='ListBox'><h2>&nbsp;<a href=\"".limpiaurl($row['empresa']).$urltoentrerprise.$row['id'].".php\">".$row['empresa']." ".$row['ruc']."</a></h2>
    Direccion ".$row['direccion']."<br />

	</li></ul>";
}
echo".$_pagi_navegacion.";
?>
</div>
......

La siguiente es la página que llamo desde include:

actividades/peru_partida_import.php

<?php 
$result = mysql_query("SELECT * FROM peru_export WHERE empresa='$empresa_operativa' ORDER BY id ASC LIMIT 1", $con); 
if ($row = mysql_fetch_array($result)){ 

while ($field = mysql_fetch_field($result)){ 
} 
do { 
echo "<a href=\"".limpiaurl($datosempresaaa['empresa']).$headers_pais."_export".$headers_idioma['lenguaje']."-".$row["id"].".php\">Exportaciones </a>";
      } while ($row = mysql_fetch_array($result)); } else { 
echo "¡ No se encontraron registros de exportaciones !"; 
}
?><br />
<strong>Otros importadores </strong>
<?php
$tabla = mysql_query("SELECT DISTINCT * FROM peru_import_partida LEFT OUTER JOIN ncm_4_dig ON peru_import_partida.partida = ncm_4_dig.ncm WHERE ruc='$ruc' LIMIT 3");
while ($registro = mysql_fetch_array($tabla)) { 
echo ''.$registro['partida'].' '.$registro['cap'].' '.$registro['desc'].'<br>
';
}
?><br />

include datos_esp

<h1><?=$headers_default['nombre_seccion']?> <?=$headers_default['nombre_localidad']?> <?=$headers_default['nombre_uf']?></h1>
<? if(!empty($datosempresaaa['empresa'])){ 
   echo utf8_decode($variable);
   echo "
	<p><b>$headers_ruc_cl $headers_ruc_co $headers_ruc_ar $headers_ruc_br RUC</b>&nbsp;".$datosempresaaa['ruc2']." ".$datosempresaaa['ruc']." ".$datosempresaaa['cod']." ".$datosempresaaa['rif']." ".$datosempresaaa['nit']." $headers_id</p>
            <p><b>Teléfono:</b>&nbsp;".$datosempresaaa['telefono']." ".$datosempresaaa['telefono_nvo']." Fax ".$datosempresaaa['fax']." ID ".$datosempresaaa['dolares']."</p>
            <p><b>Email$headers_contacto y página web</b>&nbsp;".$datosempresaaa['email']." ".$datosempresaaa['web']." ".$datosempresaaa['url']." ".$datosempresaaa['contacto']."</p>
            <p><b>Direcci&oacute;n:</b>&nbsp;".$datosempresaaa['direccion_nvo']." ".$datosempresaaa['direccion']." ".$datosempresaaa['endereco']." ".$datosempresaaa['numero']." ".$datosempresaaa['Complemento']." ".$datosempresaaa['Bairro']."</p>
            <p><b>Localidad:</b>&nbsp;".$datosempresaaa['estado']." ".$datosempresaaa['Localidad']." ".$datosempresaaa['localidad']." ".$datosempresaaa['estado_nvo']."  ".$row['provincia']." ".$datosempresaaa['ciudad_nvo']." ".$datosempresaaa['colonia']." ".$datosempresaaa['delegacion']." ".$datosempresaaa['ciudad']." ".$datosempresaaa['cp']." ".$datosempresaaa['Municipio']." ".$datosempresaaa['UF']."
            ".$datosempresaaa['municipio']." ".$datosempresaaa['uf']." ".$datosempresaaa['zona']." ".$datosempresaaa['cep']." ".$datosempresaaa['provincia']."</p>
            <p><b>Pais de la empresa:</b>&nbsp;$headers_pais2</p>
  <h2><a href='http://www.comxport.com/mas_paises.html' class='link_encabezado'><strong>Obtener mas información de
            ".$datosempresaaa['empresa']."
    </strong></a></h2>
            <p><b>Actividades:</b>&nbsp;$headers_actividad 
            $string
".$datosempresaaa['rubro_nvo']." ".$datosempresaaa['comments']." ".$datosempresaaa['producto']." ".$datosempresaaa['F12']." ".$datosempresaaa['producto2']." ".$datosempresaaa['product']." ".$datosempresaaa['partida']." ".$datosempresaaa['partida2']." ".$datosempresaaa['rubro']." 
		".$datosempresaaa['products']." ".$datosempresaaa['otros']." ".$datosempresaaa['actividad']." ".$datosempresaaa['sector']." ".$datosempresaaa['ncm']." ".$datosempresaaa['tipo']." $headers_rubcompleto";
    print "";
    } ?> 

Última edición por Lordseed; 07/03/2012 a las 11:17
  #6 (permalink)  
Antiguo 07/03/2012, 12:08
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: Queries que generan sobrecarga

Me parece que leíste al vuelo:
Cita:
Postea la sentencia completa que usas (no PHP, por favor)
Quita todo lo que no sea SQL, por favor. Es completamente irrelevante para el problema, y si es importante (como las variables), no sirve de todos modos para ver si hay algún problema con la consulta en sí.
Los temas de programación en PHP se deben tratar en su propio foro.
Ten en cuenta que el hecho de que trabajemos en MyQSL no implica que entendamos ni jota de PHP. No todos programamos en PHP, porque no es necesario para usar MyQSL.
Yo, por ejemplo, trabajo más en C#.Net y VB.Net
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 07/03/2012, 12:24
 
Fecha de Ingreso: febrero-2004
Mensajes: 143
Antigüedad: 20 años, 2 meses
Puntos: 2
Respuesta: Queries que generan sobrecarga

Disculpa mi ignorancia. Espero ahora no poner datos de mas ni de menos. Te refieres a lo siguiente?:

Código HTML:
1 - $datosempresaaa = @mysql_fetch_array(mysql_query("SELECT * FROM peru NATURAL LEFT JOIN peru_import_partida LEFT OUTER JOIN peru_empresas ON peru.ruc = peru_empresas.ruc_nvo WHERE id='".$ttempresaid."' limit 1"));

2 - $_pagi_sql = "SELECT * FROM peru";

3-$result = mysql_query("SELECT * FROM peru_export WHERE empresa='$empresa_operativa' ORDER BY id ASC LIMIT 1", $con); 
if ($row = mysql_fetch_array($result)){ 

while ($field = mysql_fetch_field($result)){ 
}

4 - $tabla = mysql_query("SELECT DISTINCT * FROM peru_import_partida LEFT OUTER JOIN ncm_4_dig ON peru_import_partida.partida = ncm_4_dig.ncm WHERE ruc='$ruc' LIMIT 3");
while ($registro = mysql_fetch_array($tabla)) { 

Etiquetas: join, php, queries, query, registros, select, sobrecarga, sql, tabla
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 09:01.