Foros del Web » Programando para Internet » PHP »

optimizar select

Estas en el tema de optimizar select en el foro de PHP en Foros del Web. Muy buenas. Ando tiempo con la mosca detras de la oreja. Se que los select consumen recursos, y dicen que no es recomendable abusar de ...
  #1 (permalink)  
Antiguo 04/03/2007, 15:48
Avatar de Pagonu50  
Fecha de Ingreso: marzo-2002
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 22 años, 1 mes
Puntos: 0
optimizar select

Muy buenas. Ando tiempo con la mosca detras de la oreja. Se que los select consumen recursos, y dicen que no es recomendable abusar de el, pero si creo un while que muestre los resultados de un select que he guardado en una variable, no se estaria repitiendo el select varias veces?
Me explicare con un trozo de codigo hecho para el ejemplo:

Esto seria la consulta:

$consulta = "SELECT nombre FROM tabla";
$consulta_query = mysql_query($consulta);
while($consulta_resultados = $mysql_fetch_array($consulta_query)) {
$consulta_resultados['nombre'];
}

Si la tabla a la que hago la consulta me muestra 30 resultados, no se repetiria 30 veces el SELECT?

Si es asi que es lo que creo ya que se repita la variable, que problema hay en abusar de los selects? o el problema viene de hacer diferentes selects a distintas tablas de una base de datos y no se refiere a repetir un solo select?

No encuentro información que me explique esta duda existencial que tengo.
  #2 (permalink)  
Antiguo 04/03/2007, 17:23
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Re: optimizar select

El select solo es ejecutado una ves. Solo se ejecuta con esta instrucción
$consulta_query = mysql_query($consulta);

Luego de esta instrucción, el resultado de la consulta es guardado en una tabla (en RAM o en Disco según el tamaño de la misma) y luego dentro del while cuando ejecutas esta instrucción:
$mysql_fetch_array($consulta_query)
lo único que hacés es recuperar el siguiente registro de esa tabla.
  #3 (permalink)  
Antiguo 04/03/2007, 21:57
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Re: optimizar select

Movido de BD a PHP.

Función de la sección de Base de Datos
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #4 (permalink)  
Antiguo 05/03/2007, 07:55
Avatar de Pagonu50  
Fecha de Ingreso: marzo-2002
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 22 años, 1 mes
Puntos: 0
Re: optimizar select

ok, ahora entiendo la practica, gracias TolaWare.
  #5 (permalink)  
Antiguo 05/03/2007, 08:56
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: optimizar select

Tené en cuenta que si de optimización hablamos, hay maneras de mejorar ese código (php no el sql del ejemplo) . Una es para ese caso usar mysql_fetch_row que en memoria consume mucho menos, y la otra es liberarla del puntero abierto por mysql_query. Esto sería no mucho mas que:
Código PHP:
$consulta "SELECT nombre FROM tabla";
$consulta_query mysql_query($consulta);
while(
$consulta_resultados $mysql_fetch_row($consulta_query)) {
echo 
$consulta_resultados[0];
mysql_free_result(  $consulta_query ); 
PD: A mysql_fetch_array podes pasarle un segundo param (int tipo_de_resultado). Podes usar una constante ya definida en php y puede tomar los siguientes valores: MYSQL_ASSOC, MYSQL_NUM, y MYSQL_BOTH. Esta característica fue agregada en PHP 3.0.7.
Lo aplicas así:
Código PHP:
while($consulta_resultados $mysql_fetch_row($consulta_queryMYSQL_NUM)) { 
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #6 (permalink)  
Antiguo 06/03/2007, 15:23
Avatar de Pagonu50  
Fecha de Ingreso: marzo-2002
Ubicación: Barcelona
Mensajes: 25
Antigüedad: 22 años, 1 mes
Puntos: 0
Re: optimizar select

ok, esto me quita la duda, no sabia que la información obtenida de la tabla se guardaba en RAM o en Disco como dice TolaWare, lo siento... Saber eso me da que pensar a la hora de formar el codigo.

Nicolaspar, me estoy mirando MYSQL_ASSOC, MYSQL_NUM, y MYSQL_BOTH, no conocia el ultimo, interesante.
  #7 (permalink)  
Antiguo 07/03/2007, 14:30
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: optimizar select

Claro, cuando tengas consultas complejas podes ponerle delante un explain (ej: explain select * from tbl inner join tbl2 on tbl.i = tbl2.i ) y ver que es lo que hace (si crea tablas temporales, si usa indices, keys, etc), para así optimizar la consulta o la/s tabla/s mediante índices y demás.

Con el tema de las constantes yo me he acostumbrado a usar mysql_fetch_row para consultas con pocos campos (ocupa muy poco en memoria), o mysql_fetch_assoc para el resto (también uso _object, pero es otro tema). De hecho, mysql_fetch_array es un híbrido entre ambas mencionadas, yo las prefiero por que es mas didáctico y leí que es mas óptimo hacer mysql_fetch_row que mysql_fetch_arrray con MYSQL_NUM (aunque no recuerdo ni donde).
__________________
Mi punto de partida es Que Bueno Lo Nuevo
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 17:10.