Улучшение производительности в этом запросе - PullRequest
0 голосов
/ 26 декабря 2010

У меня есть 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`;

Таким образом, может происходить до трех повторений для разных пользователей, поэтому я разделен по уровням.Этот вид просто для того, чтобы вернуть мне имя пользователя, в соответствии с его идентификатором и уровнем.учитывая, что у него около 500 000 зарегистрированных пользователей, это представление занимает около 1 секунды для загрузки.слишком много времени, но оно становится очень маленьким, когда мне нужно возвращать последние сообщения на форуме моего сайта.

В таблицах форумов возвращаются идентификатор и уровень пользователя, затем ищите имя в этом ПРОСМОТРЕ,Я зарегистрировал 18 форумов.Когда я запускаю запрос, это занимает одну секунду для каждого форума = 18 секунд.О, МОЙ БОГ.Эта страница загружается каждый раз, когда кто-то заходит на мой сайт.

Это мой запрос:

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 NULLNULL
2 ПРОИЗВОДИТСЯ t ВСЕ NULL NULL NULL NULL 3
3 UNION r ALL NULL NULL NULL 3
NULL UNION РЕЗУЛЬТАТ ВСЕ NULL NULL НУЛЬ NULL

Кто-нибудь может мне помочь или датьпредложение

1 Ответ

0 голосов
/ 26 декабря 2010

Чтобы делать то, что вы хотите:

Сделать запрос where name = 'whatever'.

Это вернет вам только ту строку, которую вы хотите. Возврат всех строк будет очень медленным и очень быстрым по мере увеличения количества пользователей. И ты делаешь это 3 раза.

Убедитесь, что имя проиндексировано, чтобы оно было очень быстрым.

В функции, которая вызывает это, кэшируйте любое имя, которое вы уже запросили в хэше. Если он не установлен, сделайте запрос, поместите результат в хеш. Если оно установлено, вернуть значение.

Дополнительная информация о том, как это называется, была бы очень полезна.

Я бы порекомендовал другую структуру таблицы:

Таблица 1: Пользователи
UserId, Имя

Таблица 2: Разрешения
id, UserId, Level

Надеюсь, это поможет.

...