Foros del Web » Programando para Internet » PHP »

Optimizar consulta mysql

Estas en el tema de Optimizar consulta mysql en el foro de PHP en Foros del Web. Buenos días, espero que estén bien, tengo el siguiente código y la cosa es que pienso que en la manera en que lo hice está ...
  #1 (permalink)  
Antiguo 13/09/2016, 12:27
 
Fecha de Ingreso: enero-2016
Ubicación: Venezuela
Mensajes: 139
Antigüedad: 8 años, 3 meses
Puntos: 3
Optimizar consulta mysql

Buenos días, espero que estén bien, tengo el siguiente código y la cosa es que pienso que en la manera en que lo hice está mal escrito ya que se ejecuta muchas veces, hay alguna manera de optimizar esto?
Es un código que me genera un número aleatorio que exista en la base de datos y lo uso para generar imágenes aleatorias:

Código PHP:
Ver original
  1. $base = mysql_query("SELECT * FROM base WHERE visible = '2' ORDER BY RAND() LIMIT 1");
  2. $slider1 = mysql_fetch_array($base);
  3. $array1= $slider1['id'];
  4. $nombre1 = mysql_query("SELECT * FROM nombre WHERE id = '$array1'");
  5. $arraynombre1 = mysql_fetch_array($nombre1);
  6. $arraymun1 = $slider1['idmun'];
  7. $nombremun1 = mysql_query("SELECT * FROM mun WHERE idmun = '$arraymun1'");
  8. $arraynombremun1 = mysql_fetch_array($nombremun1);
  9. ?>

El código funciona perfecto, pero la cosa está en que lo repito más de 10 veces para generar varios, es decir este mismo código lo repito pero con slider2, slider3.
No se si esto pueda generar problemas en mi hosting.

Además de ello, me podrían aconsejar como optimizar mis consultas para no consumir tantos recursos de mi hosting? O como optimizar mis códigos.

Muchas gracias y saludos.
  #2 (permalink)  
Antiguo 13/09/2016, 14:11
Avatar de KATHYU  
Fecha de Ingreso: julio-2013
Mensajes: 547
Antigüedad: 10 años, 9 meses
Puntos: 46
Respuesta: Optimizar consulta mysql

Pues el hecho de que traigas todo con * from te hace mas lenta la consulta.

Podes comenzar por halar solo los campos que necesitas
__________________
Al contrario de lo que muchos podrían afirmar, ayudar no te hace pobre, sino más rico.
  #3 (permalink)  
Antiguo 13/09/2016, 15:57
 
Fecha de Ingreso: enero-2016
Ubicación: Venezuela
Mensajes: 139
Antigüedad: 8 años, 3 meses
Puntos: 3
Respuesta: Optimizar consulta mysql

Gracias por responder, pero la cosa es que no se si esté bien hecho de esa manera? imaginate ese código se repite tantas veces, eso generaría lentitud o sobrecarga del servidor?
  #4 (permalink)  
Antiguo 13/09/2016, 16:17
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Optimizar consulta mysql

Ejecuta la consulta una sola vez, con limit 10 y guardas el resultado en un array para usarlo posteriormente en cada lugar donde lo necesites.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 13/09/2016, 16:22
 
Fecha de Ingreso: enero-2016
Ubicación: Venezuela
Mensajes: 139
Antigüedad: 8 años, 3 meses
Puntos: 3
Respuesta: Optimizar consulta mysql

Cita:
Iniciado por Triby Ver Mensaje
Ejecuta la consulta una sola vez, con limit 10 y guardas el resultado en un array para usarlo posteriormente en cada lugar donde lo necesites.
Disculpa, no entendí muy bien, sería algo cómo esto?:

Código PHP:
$base mysql_query("SELECT * FROM base WHERE visible = '2' ORDER BY RAND() LIMIT 10");
$array mysql_fetch_array;
$numero1 $array[0]; 
Algo así?
  #6 (permalink)  
Antiguo 13/09/2016, 16:36
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Optimizar consulta mysql

No, según ese código erróneo, solo leerías el primer resultado de la consulta, aparte, también necesitas unir las otras tablas.

Código MySQL:
Ver original
  1. SELECT b.*, n.*, m.* FROM base b
  2.     LEFT JOIN nombre n ON b.id = n.id
  3.     LEFT JOIN mun m ON b.idmun = m.idmun
  4.     WHERE visible = '2' ORDER BY RAND() LIMIT 1

Código PHP:
Ver original
  1. $slider = array();
  2. $base = mysql_query('*** la consulta de arriba ****');
  3. while($row = mysql_fetch_assoc($base)) {
  4.     $slider[] = $row;
  5. }
  6.  
  7. // Cuando necesites acceder a una imagen, entonces verificas que se ha cargado
  8. // Recuerda que los índices de array en PHP comienzan en cero, por lo que será del 0 al 9
  9.  
  10. // Para mostrar la imagen 5 (el índice será el 4)
  11. if(isset($slider[4])) {
  12.     // Si se cargó la imagen
  13.     echo $slider[4]['id'];
  14.     echo $slider[4]['nombre'];
  15.     echo $slider[4]['idmun'];
  16. }
  17.  
  18. // Si lo que necesitas es mostrar todas las imágenes en un mismo slider
  19. // es más conveniente usar un foreach
  20. foreach($slider as $imagen) {
  21.     echo $imagen['nombre'];
  22. }

Para cualquier duda referente a JOIN y sus variantes, por favor pregunta en el foro adecuado: http://www.forosdelweb.com/f86/

Finalmente, la librería mysql está obsoleta y es recomendable que cambies a mysqli o, mejor aún, a PDO.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 15/09/2016, 21:48
 
Fecha de Ingreso: enero-2016
Ubicación: Venezuela
Mensajes: 139
Antigüedad: 8 años, 3 meses
Puntos: 3
Respuesta: Optimizar consulta mysql

Muchísimas gracias, funciona muy bien, pero tengo una duda, por que cuando paso que si por ejemplo a $slider[11] me devuelve lo siguiente: Undefined offset: 11, con todos funciona bien escribiéndolo cómo dijiste
Código PHP:
Ver original
  1. echo $slider[11]['id'];
  2.     echo $slider[11]['nombre'];
  3.     echo $slider[11]['idmun'];
Y en todos los demás para atrás (10,9,8..) Funciona perfecto.
  #8 (permalink)  
Antiguo 16/09/2016, 13:02
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Optimizar consulta mysql

Qué límite pusiste?, por error, en la consulta que sugerí es 1, pero si usaste 10, desde el 10 deberías obtener el error.

Como te explicaba, con LIMIT 10, obtendrás un array de 10 elementos, numerados del cero al 9, al intentar acceder a un elemento que no existe (10, 11, etc.) vas a obtener ese error.

Necesitas cargar más registros?, modifica el LIMIT.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 16/09/2016, 17:39
 
Fecha de Ingreso: enero-2016
Ubicación: Venezuela
Mensajes: 139
Antigüedad: 8 años, 3 meses
Puntos: 3
Respuesta: Optimizar consulta mysql

Cita:
Iniciado por Triby Ver Mensaje
Qué límite pusiste?, por error, en la consulta que sugerí es 1, pero si usaste 10, desde el 10 deberías obtener el error.

Como te explicaba, con LIMIT 10, obtendrás un array de 10 elementos, numerados del cero al 9, al intentar acceder a un elemento que no existe (10, 11, etc.) vas a obtener ese error.

Necesitas cargar más registros?, modifica el LIMIT.
No puse LIMIT, lo quité pero solo me deja 10.

Etiquetas: mysql, select
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:15.