Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 改进此查询中的性能_Sql_Mysql_Performance_Join_Union All - Fatal编程技术网

Sql 改进此查询中的性能

Sql 改进此查询中的性能,sql,mysql,performance,join,union-all,Sql,Mysql,Performance,Join,Union All,我有3个用户登录的表: sis\u登录=>administrators 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 al

我有3个用户登录的表:

sis\u登录=>administrators 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和级别返回我的用户名。考虑到它有大约500000个注册用户,加载此视图大约需要1秒。时间太多了,但当我需要返回我网站论坛上的最新帖子时,时间变得非常少

论坛的表返回用户id和级别,然后在此视图中查找名称。我已经注册了18个论坛。当我运行查询时,每个论坛需要1秒=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联合结果所有NULL NULL 2派生的t全部为空3 3联合r全部为空3 NULL联合结果所有NULL NULL

有人能帮我或给我一个建议吗?

要做你想做的事:

执行一个查询,其中name='whatever'

这将返回到您想要的行。随着用户数量的增加,返回所有行的速度会变得非常慢。你做了三次

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

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

更多关于如何调用的信息将非常有用

实际上,我建议使用不同的表结构:

表1:用户 用户名

表2:权限 用户id,用户id,级别


希望这有帮助。

谢谢您的回复。不幸的是,我无法更改结构,因为我使用的是来自其他系统的数据库。我不能用WHERE name='随便什么',因为这个名字正是我需要的。查询返回我:论坛id、主题id、每个论坛最后一篇文章的用户名,然后我无法指定名称:但无论如何,谢谢。在这种情况下,我建议最好使用ajax分别获取每个论坛的最后一篇文章。这样,用户就不需要等待时间来查看页面。替换请求的数据时,只需等待一段时间。再次感谢您,evan!=我是按照你的建议做的。