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`;

したがって、異なるユーザーに対して最大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

誰かが私を助けたり、提案をしたりできますか?

4

1 に答える 1

0

あなたがやりたいことをするために:

クエリを実行しますwhere name = 'whatever'

これにより、必要な行だけが返されます。ユーザー数が増えると、すべての行を返すのが非常に速くなります。そして、あなたはそれを3回やっています。

非常にすばやくできるように、名前にインデックスが付けられていることを確認してください。

これを呼び出す関数で、すでに要求した名前をハッシュにキャッシュします。設定されていない場合は、クエリを実行し、結果をハッシュに入れます。設定されている場合は、値を返します。

これがどのように呼び出されているかについての詳細は、非常に役立ちます。

私は実際には別のテーブル構造をお勧めします:

表1:ユーザー
UserId、名前

表2:権限
ID、ユーザーID、レベル

お役に立てれば。

于 2010-12-26T18:50:01.423 に答える