MySQL - Problema con MySQL

 
Vista:

Problema con MySQL

Publicado por Pioter (4 intervenciones) el 11/09/2007 17:21:42
# Time: 070911 10:05:50
# Query_time: 27 Lock_time: 0 Rows_sent: 668 Rows_examined: 5968937
SELECT * FROM ((((images INNER JOIN usuarios ON images.id_usuario = usuarios.id
_usuario ) INNER JOIN categorias ON images.id_categoria = categorias.id_categori
a ) INNER JOIN tipos ON tipos.id_tipo = usuarios.id_tipo ) LEFT JOIN country ON
usuarios.country = country.id_country) INNER JOIN plan_usuario ON usuarios.id_us
uario = plan_usuario.id_usuario WHERE plan_usuario.id_plan > 1 group by usuario
s.id_usuario order by usuarios.id_usuario DESC;
Rows_examined: 5968937

Les comento, estoy armando un sitio y esta consulta a MYSQL está en la principal, buscando usuario y relacionando con imágenes, país, etc.

Pero a medida que crece la base de datos se produce la lentitud por haber examinado casi 6000000 de registros cada vez que entra un visitante, las preguntas son

Se puede simplificar esta consulta?
Como podría hacer para que solo consulte cuando hay cambios en la base de datos? y no tenga que recorrerla toda en cada visita.

Agradeceré soluciones.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con MySQL

Publicado por kain (124 intervenciones) el 12/09/2007 10:06:55
para poder decirte si se puede simplificar la consulta, se necesita la estructura de la tabla images, tambien que campos necesitas de dicha tabla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con MySQL

Publicado por pioter (4 intervenciones) el 12/09/2007 13:06:07
jose luis:

Gracias por contestar. En realidad me dicen que está haciendo un loop y por eso tiene tantas consultas a registros, pero yo la verdad, no lo encuentro en esta programación. Sin embargo, según vuestra pregunta te listo los campos de la tabla images.

id_image
id_usuario
id_categoria
url.......(son las fotografías)

SELECT * FROM ((((images INNER JOIN usuarios ON images.id_usuario = usuarios.id
_usuario ) INNER JOIN categorias ON images.id_categoria = categorias.id_categoria ) INNER JOIN tipos ON tipos.id_tipo = usuarios.id_tipo ) LEFT JOIN country ON
usuarios.country = country.id_country) INNER JOIN plan_usuario ON usuarios.id_us
uario = plan_usuario.id_usuario WHERE plan_usuario.id_plan > 1 group by usuario
s.id_usuario order by usuarios.id_usuario DESC;

Los registros que busca son con id_usuario descendente ya que los últimos 5 registros se exponen en la home con los siguientes datos:

Nombre usuario .......tabla usuarios
fotografía.................tabla images
país...........tabla country

Si puedes decir adonde podría estar ese loop, pues la sentencia completa es:

//End Prepare Method

//Open Method
function Open()
{
$this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeBuildSelect");
$this->CountSQL = "SELECT COUNT(*) FROM ((((images INNER JOIN usuarios ON " .
"images.id_usuario = usuarios.id_usuario ) INNER JOIN categorias ON " .
"images.id_categoria = categorias.id_categoria ) INNER JOIN tipos ON " .
"tipos.id_tipo = usuarios.id_tipo ) LEFT JOIN country ON " .
"usuarios.country = country.id_country) INNER JOIN plan_usuario ON ".
"usuarios.id_usuario = plan_usuario.id_usuario ".
" WHERE plan_usuario.id_plan > 1 ".
"group by usuarios.id_usuario";
$this->SQL = "SELECT * " .
"FROM ((((images INNER JOIN usuarios ON " .
"images.id_usuario = usuarios.id_usuario ) INNER JOIN categorias ON " .
"images.id_categoria = categorias.id_categoria ) INNER JOIN tipos ON " .
"tipos.id_tipo = usuarios.id_tipo ) LEFT JOIN country ON " .
"usuarios.country = country.id_country) INNER JOIN plan_usuario ON ".
"usuarios.id_usuario = plan_usuario.id_usuario ".
" WHERE plan_usuario.id_plan > 1 ".
"group by usuarios.id_usuario order by usuarios.id_usuario DESC";
$this->CCSEventResult = CCGetEvent($this->CCSEvents, "BeforeExecuteSelect");
$this->RecordsCount = CCGetDBValue($this->CountSQL, $this);
$this->query(CCBuildSQL($this->SQL, "", $this->Order));
$this->CCSEventResult = CCGetEvent($this->CCSEvents, "AfterExecuteSelect");
$this->MoveToPage($this->AbsolutePage);
}
//End Open Method
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con MySQL agregado

Publicado por pioter (4 intervenciones) el 12/09/2007 15:33:00
La idea es pedir solo los últimos cinco registros solamente, ya que está recorriendo toda la tabla además de haber algún problema, o sea los cinco últimos de id_usuario para mostrar:

Nombre usuario .......tabla usuarios
fotografía.................tabla images
país...........tabla country

Si bien están indexados podría haber bajas, es decir, si el último id_usuario=100
podría ser que los 5 últimos sean 100 97 86 77 76, y los intermedios ya no están.

Es un lio esto pero me estoy matando.

Con la sentencia que te puse en la otra nota funciona, pero recorre toda la tabla y se cuelga la home.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con MySQL agregado

Publicado por kain (124 intervenciones) el 12/09/2007 17:22:12
vayamos por partes.(como dijo Jack el Destripador).

primero lo que necesitas son los cinco últimos, eso lo solucionamos así)

WHERE plan_usuario.id_plan > 1 group by usuarios.id_usuario order by usuarios.id_usuario DESC LIMIT 5

el tema esta en LIMIT 5,

como esta ordenado por id_usuario DESC pues cojera lo cinco últimos con el id mas grande, sea cual sea.

otra parte.(meterle mano al SELECT, (en el buen sentido de la palabra).

yo lo dejaría de la siguiente manera:

SELECT usuarios.nombre_user,images.fotografia,country.pais FROM images
LEFT OUTER JOIN categorias ON (images.id_categoria = ategorias.id_categorias)
LEFT OUTER JOIN tipos ON (tipos.id_tipo = usuarios.id_tipo)
LEFT OUTER JOIN country ON (usuarios.country = country.id_country)
LEFT OUTER JOIN plan_usuario ON (usuarios.id_usuario = plan_usuario.id_usuario)
WHERE plan_usuario.id_plan > 1 AND categorias.id_categorias=1 AND
usuarios.id_tipo=1 AND usuarios.country=1
GROUP BY usuarios.id_usuario ORDER BY usuarios.id_usuario DESC LIMIT 5;

como puedes ver las condiciones van después del WHERE así que solo debes poner/quitar las que no necesites
por supuesto elimina también los LEFT OUTER JOIN que te sobren o no necesites.

haber si ahora va mejor.

un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con MySQL agregado

Publicado por Pioter (4 intervenciones) el 12/09/2007 21:40:20
Kain muchas gracias por tu respuesta, pero no he podido hacerlo aún pues los cambios en SELECT COUNT y SELECT no he podido ordenarlos. Está lentísima la home y a veces se cuelga.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar