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

Vista lenta

Estas en el tema de Vista lenta en el foro de Mysql en Foros del Web. Buenos días, a ver si alguien me puede echar una mano con una vista que tira mano de una función. Pongo la consulta y explico ...
  #1 (permalink)  
Antiguo 14/11/2008, 01:55
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Vista lenta

Buenos días, a ver si alguien me puede echar una mano con una vista que tira mano de una función. Pongo la consulta y explico que hace luego:

Cita:
CREATE ALGORITHM=UNDEFINED

DEFINER=`mda`@`localhost` SQL SECURITY

DEFINER VIEW `vista_indice_foros` AS

select
`foro`.`titulo` AS `titulo`,
`Total_Posts`(`foro`.`id`) AS `contador`,
(case when (`Ultimo_Post`(`foro`.`id`) is not null) then `Ultimo_Post`(`foro`.`id`) else _utf8'' end) AS `ultimo_post`,
(case when (`Ultimo_Post`(`foro`.`id`) is not null) then `Usuario`(`post`.`id_usuario`) else _utf8'' end) AS `usuario`,
(case when (`Ultimo_Post`(`foro`.`id`) is not null) then `post`.`titulo` else _utf8'' end) AS `titulo_post`,
(case when (`Ultimo_Post`(`foro`.`id`) is not null) then `post`.`titulo_url` else _utf8'' end) AS `titulo_url_post`,
(case when (`Ultimo_Post`(`foro`.`id`) is not null) then `post`.`fecha` else _utf8'' end) AS `fecha_post`

from ((`foros` `foro` join `foros_posts` `post`) join `foros_categorias` `cat`)

where (((`foro`.`id` = `post`.`id_foro`) or (`Total_Posts`(`foro`.`id`) = 0)) and (`cat`.`id` = `foro`.`id_categoria`)) group by `foro`.`id`;
La vista es para que haga un listado de foros que tengo en una tabla, y consulte mediante la funcion Ultimo_Post si tiene algun post insertado o no, en el caso de que lo tenga muestra el campo.

El problema es como llama a la misma funcion varias veces, creo que la relentiza un poco bastante, y la verdad que no me convence mucho llamar a la misma funcion tantas veces para sacar siempre lo mismo.

Igual hay un metodo más simple, pero no lo conozco.

A ver si alguien me ayuda.

Saludos,
__________________
Saludos!
  #2 (permalink)  
Antiguo 14/11/2008, 07:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Vista lenta

Divide y venceras....

Código:
Select `subConsulta1`.`titulo` AS `titulo`,
           `subConsulta1`.`Total_Posts,
           `subConsulta2`.`id` as `UltimoPost`,
           `subConsulta2`.`Usuario` as `Usuario`,
           `subConsulta2`.`titulo` as `titulo_post`,
           `subConsulta2`.`titulo_url` as `titulo_url_post`,
           `subConsulta2`.`fecha` as `fecha_post`

FROM

(Select `foro`.`id`,`foro`.`titulo` AS `titulo`, COUNT(*)  as `Total_Posts`
    FROM `foros` `foro` LEFT JOIN `foros_posts` `post`
               ON `foro`.`id`=`post`.`id_foro`
group by `foro`.`id`,`foro`.`titulo`) `subConsulta1`

LEFT JOIN 

(Select `fp`.`id`, `fp`.`id_foro`,`usu`.`Usuario`, 
            `fp`.`titulo`, `fp`.`titulo_url`,`fp`.fecha`
FROM `foros_posts` `fp` join `Usuarios` `usu`
      on `fp`.`id_usuario`=`usu`.`id`
WHERE `fp`.`id` IN (Select max(`subfp`.`id`) as `ultimopost` 
                         from `foros_posts` `subfp`
                         group by `subfp`.`id_foro`)) `subConsulta2`

ON `subConsulta1`.`id`=`subConsulta2.`id_foro`;
A vote pronto creo que esto da lo mismo que lo tuyo pero sin funciones solo con SQL, he supuesto que tienes una tabla usuarios donde en el campo usuario esta el nombre del usuario, es decir lo que buscas con la función `Usuario`(`post`.`id_usuario`) .

En la subconsulta1 obtengo una lista de todos los foros con su total de post.

En la dos obtengo los datos del ultimo post de los foros que tengan algun post

El LEFT JOIN entre las dos subconsulta me asegura que me va ha mostrar todos los foros (parte izquierda de la relación) tengan o no ultimo post.

Tambien he supuesto que si creas vistas estas usando innoDB

Quim
  #3 (permalink)  
Antiguo 18/11/2008, 04:24
 
Fecha de Ingreso: mayo-2005
Ubicación: Muy lejos de aquí
Mensajes: 367
Antigüedad: 18 años, 11 meses
Puntos: 0
Respuesta: Vista lenta

Muchas gracias por la respuesta!
__________________
Saludos!
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 16:22.