Mejorar el rendimiento en esta consulta
-
13-10-2019 - |
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?
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.