Pregunta

Tengo 3 tablas con los inicios de sesión de usuario:

sis_login => administradores tb_rb_estrutura => coordinadores tb_usuario => clientes

crea una vista para unir a todos estos usuarios separándolas por niveles, de la siguiente manera:

create view `login_names` as select `n1`.`cod_login` as `id`, '1' as `level`, `n1`.`nom_user` as `name` from `dados`.`sis_login` `n1`
union all
select `n2`.`id` as `id`, '2' as `level`, `n2`.`nom_funcionario` as `name` from `tb_rb_estrutura` `n2`
union all
select `n3`.`cod_usuario` as `id`, '3' as `level`, `n3`.`dsc_nome` as `name` from `tb_usuario` `n3`;

Por lo tanto, puede ocurrir hasta tres identificadores de repetidos para diferentes usuarios, por lo que me separé por niveles. Este punto de vista es sólo para el nombre de usuario de retorno de mí, de acuerdo con su ID y nivel. teniendo en cuenta que tiene cerca de 500.000 usuarios registrados, esta visión tardará aproximadamente 1 segundo a la carga. demasiado tiempo, pero es muy pequeño cuando se convierte necesito devolver los últimos mensajes en el foro de mi página web.

Las mesas de los foros de devolver el identificador de usuario y el nivel, y luego buscar un nombre en esta vista. Me he registrado 18 foros. Cuando ejecuto la consulta, se necesita un segundo por cada foro = 18 segundos. DIOS MIO. Carga de esta página cada vez que alguien entra en mi página web.

Esta es mi consulta:

select `x`.`forum_id`, `x`.`topic_id`, `l`.`nome`
from (
select `t`.`forum_id`,  `t`.`topic_id`, `t`.`data`, `t`.`user_id`, `t`.`user_level`
from `tb_forum_topics` `t`
union all
select `a`.`forum_id`, `a`.`topic_id`, `a`.`data`, `a`.`user_id`,  `a`.`user_level`
from `tb_forum_answers` `a` ) `x`
left outer join `login_names` `l`
on `l`.`id` = `x`.`user_id` and `l`.`level` = `x`.`user_level`
group by `x`.`forum_id` asc

USO explico:

id  select_type table       type    possible_keys   key key_len ref rows    Extra
1   PRIMARY     <derived2>  ALL NULL        NULL    NULL    NULL    6   Using temporary; Using filesort
1   PRIMARY     <derived4>  ALL NULL        NULL    NULL    NULL    530415   
4   DERIVED     n1      ALL NULL        NULL    NULL    NULL    114  
5   UNION       n2      ALL NULL        NULL    NULL    NULL    2    
6   UNION       n3      ALL NULL        NULL    NULL    NULL    530299   

NULL UNIÓN RESULTADO Todos NULL NULL NULL NULL NULL
2 derivada T todo NULL NULL NULL NULL 3
3 UNIÓN r todos NULL NULL NULL NULL 3
NULL UNIÓN RESULTADO Todos NULL NULL NULL NULL NULL

Alguien me puede ayudar o dar una sugerencia?

¿Fue útil?

Solución

Para hacer lo que quiera:

Hacer un where name = 'whatever' consulta.

Esto devolverá a que sólo la fila que desea. Volviendo todas las filas se pondrá muy lento muy rápidamente ya que el número de usuarios aumenta. Y lo está haciendo 3 veces.

Asegúrese de que el nombre está indexado para que sea muy rápido.

En una función que llama a esto, caché cualquier nombre que ya se ha solicitado en un hash. Si no se establece, hacer la consulta, poner el resultado en el hash. Si se establece, devolver el valor.

Para más información acerca de cómo esto está siendo llamada sería de gran ayuda.

De hecho, me recomendaría una estructura de tabla diferente:

Tabla 1: Los usuarios Identificación de usuario, nombre

Tabla 2: Los permisos
ID, ID de usuario, Nivel

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top