質問

ユーザーログインを備えた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`;

したがって、異なるユーザーに対して繰り返される最大3つのIDが発生する可能性があるため、レベルで分離しました。このビューは、彼のIDとレベルに従って、ユーザー名を返すことです。約500,000人の登録ユーザーがいることを考慮すると、このビューには約1秒かかります。時間がかかりすぎますが、私のウェブサイトのフォーラムの最新の投稿を返す必要があるときに非常に小さくなります。

フォーラムの表はユーザーIDとレベルを返し、このビューで名前を探します。 18のフォーラムを登録しました。クエリを実行すると、各フォーラム= 18秒で1秒かかります。ああ、神様。このページは、誰かが私のウェブサイトに入るたびにロードされます。

これが私の質問です:

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すべてのnull null null null 3
3ユニオンrすべてnull null null null 3
ヌルユニオンは、すべてのヌルヌルヌルヌルヌルを引き起こします

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

役に立ちましたか?

解決

あなたが望むことをするために:

クエリを行います where name = 'whatever'.

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

名前がインデックス付けされていることを確認して、非常に迅速にしてください。

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

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

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

表1:ユーザー
userid、name

表2:許可
id、userid、level

お役に立てれば。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top