ユーザーログインのあるテーブルが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`;
したがって、異なるユーザーに対して最大3つのIDが繰り返される可能性があります。そのため、レベルで区切りました。このビューは、IDとレベルに応じて、ユーザー名を返すためのものです。登録ユーザーが約50万人いることを考えると、このビューの読み込みには約1秒かかります。時間がかかりすぎますが、自分のWebサイトのフォーラムで最新の投稿を返す必要がある場合は非常に小さくなります。
フォーラムのテーブルはユーザーIDとレベルを返し、このビューで名前を探します。18のフォーラムを登録しました。クエリを実行すると、フォーラムごとに1秒=18秒かかります。ああ、神様。このページは、誰かが私のWebサイトにアクセスするたびに読み込まれます。
これは私の質問です:
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
NULLNULL2派生tALLNULL NULL NULL NULL 3
3 UNION r ALL NULL NULL NULL NULL 3
NULL UNION RESULT ALL NULL NULL NULL NULL NULL
誰かが私を助けたり、提案をしたりできますか?