このクエリのパフォーマンスの向上
-
13-10-2019 - |
質問
ユーザーログインを備えた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
お役に立てれば。