0

我有 3 个带有用户登录名的表:

sis_login => 管理员 tb_rb_estrutura => 协调员 tb_usuario => 客户

我创建了一个 VIEW 以通过按级别分隔所有这些用户来统一所有这些用户,如下所示:

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,这就是我按级别分隔的原因。这个 VIEW 只是返回我的用户名,根据他的 id 和级别。考虑到它有大约 500,000 个注册用户,这个视图大约需要 1 秒才能加载。太多时间,但是当我需要在我的网站论坛上返回最新帖子时,它变得非常小。

论坛的表格返回用户 id 和级别,然后在此 VIEW 中查找名称。我已经注册了 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   

NULL UNION RESULT ALL NULL NULL NULL NULL NULL
2 DERIVED t ALL NULL NULL NULL NULL 3
3 UNION r ALL NULL NULL NULL NULL 3
NULL UNION RESULT ALL NULL NULL NULL NULL NULL

有人可以帮助我或提供建议吗?

4

1 回答 1

0

做你想做的事:

做一个查询where name = 'whatever'

这将只返回您想要的行。随着用户数量的增加,返回所有行将变得非常缓慢。你做了3次。

确保该名称已编入索引以使其非常快速。

在调用它的函数中,将您已经请求的任何名称缓存在哈希中。如果未设置,则进行查询,将结果放入哈希中。如果已设置,则返回该值。

有关如何调用它的更多信息将非常有帮助。

我实际上会推荐一个不同的表结构:

表 1:用户
UserId、名称

表 2:权限
ID、用户 ID、级别

希望这可以帮助。

于 2010-12-26T18:50:01.423 回答