-
13-10-2019 - |
题
我有3个具有用户登录的表:
sis_login =>管理员tb_rb_estrutura =>协调员tb_usuario =>客户端
我创建了一个视图,通过按级别将所有这些用户分开来团结所有这些用户,如下所示:
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`;
因此,最多可以针对不同用户重复三个ID,这就是为什么我通过级别分开的原因。这种观点只是根据他的ID和级别返回我的用户名。考虑到它有大约500,000个注册用户,此视图大约需要1秒钟才能加载。太多的时间,但是当我需要在网站论坛上返回最新帖子时,变得很小。
论坛的表返回用户ID和级别,然后在此视图中查找名称。我已经注册了18个论坛。当我运行查询时,每个论坛= 18秒都需要一秒钟。我的天啊。每当有人输入我的网站时,此页面都会加载。
这是我的查询:
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
使用解释:
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
零联合结果所有无效无效无效无效
2派生t全零零无效3
3联合r全零零零零3
零联合结果所有无效无效无效无效
有人可以帮助我或提出建议?
解决方案
做你想做的事:
进行查询 where name = 'whatever'
.
这将返回您想要的行。随着用户数量的增加,返回所有行将非常慢。而且您正在做3次。
确保索引该名称以使其非常快。
在调用此功能的函数中,缓存您已经在哈希中请求的任何名称。如果未设置,请进行查询,将结果放在哈希中。如果设置了,请返回值。
有关如何称呼的更多信息将非常有帮助。
我实际上会推荐不同的表结构:
表1:用户
USERID,名称
表2:权限
ID,用户ID,级别
希望这可以帮助。
不隶属于 StackOverflow