2010-12-26 1 views
0

J'ai 3 tables avec des connexions utilisateur:L'amélioration des performances dans cette requête

sis_login => administrateurs tb_rb_estrutura => coordinateurs tb_usuario => clients

Je créé en vue d'unir tous ces utilisateurs en les séparant par des niveaux, comme suit:

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

Alors, peut se produire jusqu'à trois ids répétées pour différents utilisateurs, ce qui est la raison pour laquelle je me suis séparé par niveaux. Cette vue est juste pour me renvoyer le nom d'utilisateur, en fonction de son identifiant et de son niveau. compte tenu qu'il a environ 500 000 utilisateurs enregistrés, cette vue prend environ 1 seconde à charger. trop de temps, mais devient très petit quand je dois retourner les derniers messages sur le forum de mon site.

Les tables des forums renvoient l'ID utilisateur et le niveau, puis recherchent un nom dans cette vue. J'ai enregistré 18 forums. Lorsque j'exécute la requête, cela prend une seconde pour chaque forum = 18 secondes. OMG. Cette page se charge chaque fois que quelqu'un entre sur mon site.

C'est ma requête:

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 

UTILISATION EXPLIQUER:

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 RESULTAT ALL NULL NULL NULL NULL NULL
2 DÉRIVÉS t ALL NULL NULL NULL NULL 3
3 UNION r ALL NULL NULL NULL NULL 3
NUL UNION RÉSULTAT TOTAL NULL NULL NULL NULL

Quelqu'un peut m'aider ou donner une suggestion?

Répondre

0

Pour faire ce que vous voulez:

Faites une requête where name = 'whatever'.

Cela vous renverra juste la ligne que vous voulez. Le retour de toutes les lignes devient très lent très rapidement à mesure que le nombre d'utilisateurs augmente. Et vous le faites 3 fois.

Assurez-vous que le nom est indexé pour le rendre très rapide.

Dans une fonction qui l'appelle, mettez en cache tout nom que vous avez déjà demandé dans un hachage. Si ce n'est pas le cas, faites la requête, mettez le résultat dans le hachage. Si elle est définie, renvoyez la valeur.

Plus d'informations sur comment cela s'appelle serait très utile.

je recommande en fait une structure de table différente:

Tableau 1: Les utilisateurs
USERID Nom

Tableau 2: Autorisations
id, UserId, Niveau

Hope this helps.

+0

Merci pour votre réponse. Malheureusement je ne peux pas changer la structure, puisque j'utilise des bases de données d'autres systèmes. Et je ne peux pas utiliser WHERE name = 'quel que soit' parce que le nom est ce dont j'ai besoin.La requête me renvoie: forum_id, topic_id, user_name du dernier post de chaque forum, alors je ne peux pas spécifier un nom :(Mais merci quand même –

+0

Dans ce cas, je recommande d'utiliser ajax de préférence pour obtenir le dernier message de chaque forum individuellement De cette façon, il n'y a pas de temps d'attente pour que l'utilisateur puisse voir la page, il y a seulement un temps d'attente pour remplacer les données demandées. – evan

+0

Encore merci, evan! =) Je l'ai fait comme suggestion. –

Questions connexes