2010-12-26 34 views
0

におけるパフォーマンスの向上しますレベルによって、次のように:は、私は、ユーザーのログインと3つのテーブルを持って、このクエリ

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を発生することがあります。このVIEWはIDとレベルに従って私のユーザー名を返すだけです。登録ユーザが約50万人いることを考えると、このビューには約1秒かかることがあります。あまりにも多くの時間が、私のウェブサイトのフォーラムで最新の投稿を返す必要があるときは非常に小さくなります。

フォーラムのテーブルでは、ユーザーIDとレベルが返され、このVIEWで名前が検索されます。私は18のフォーラムを登録しました。クエリを実行すると、フォーラムごとに1秒= 18秒かかります。ああ、神様。このページは誰かが私のウェブサイトに入るたびに読み込まれます。

これは私のクエリです:

EXPLAINの利用
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 

ALL NULL NULL NULL NULL 3
3 UNION tの由来
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結果ALL NULL NULL NULL NULL NULL
2 r ALL NULL NULL NULL NULL 3
NULL UNION RESULT ALL NULL NULL NULL NULL NULL

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

は、クエリwhere name = 'whatever'の操作を行います。あなたがやりたい

答えて

0

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

名前がインデックスに登録されていることを確認してください。

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

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

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

表1:ユーザー
ユーザーID、名前

表2:権限
ID、ユーザーID、このことができますレベル

希望。

+0

ご返信ありがとうございます。残念ながら、他のシステムのデータベースを使用しているため、構造を変更できません。そして、私はWHERE name = '何でも'という名前を使うことはできません。質問は返されます:forum_id、topic_id、user_name各フォーラムの最後の投稿から、私は名前を指定することはできません:(しかし、とにかくありがとう –

+0

その場合は、好ましくは各フォーラムの最後の投稿を取得するためにajaxを使用することをお勧めしますそういうわけで、ユーザーがページを見るための待ち時間はありません。要求されたデータが入ってくると、それを置き換えるための待ち時間があります。 – evan

+0

ありがとう、evan!=)私はあなたの提案としてそれを行いました。 –

関連する問題