Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2014, 19:20   #1
sanich_23
 
Регистрация: 19.05.2007
Сообщений: 9
По умолчанию Оптимизация запроса not in (select ...

Добрый день.
Прошу помочь в оптимизации запроса Mysql:

PHP код:
select count(distinct(t.em)) as cr from
  
(select email as em from object where email<>''
   
union all
   select email 
as em from job_list where email<>''
   
union all
   select from_email 
as em from send_message where from_email<>\'\'
  ) as t where t.em not in (SELECT email FROM send_ignore_list_email) 

Не очень быстро работает, 2.4 сек
Проблема имеено в последней выборке
PHP код:
as t where t.em not in (SELECT email FROM send_ignore_list_email

Вычитал что not in можно заменить на LEFT OUTER JOIN

Сделал следующее:

PHP код:
select count(distinct(t.em)) as cr from
 
(select email as em from object where email<>''
  
union all
  select email 
as em from job_list where email<>''
  
union all
  select from_email 
as em from send_message where from_email<>''
) as t
LEFT OUTER JOIN send_ignore_list_email ON email
=t.em where email is null 

Тоже не очень быстро работает, 2.37 сек

Помогите пожалуйста
sanich_23 вне форума Ответить с цитированием
Старый 06.11.2014, 19:31   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

send_ignore_list_email.email индекс есть?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.11.2014, 20:36   #3
sanich_23
 
Регистрация: 19.05.2007
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
send_ignore_list_email.email индекс есть?
Да, PRIMARY
sanich_23 вне форума Ответить с цитированием
Старый 06.11.2014, 22:15   #4
sanich_23
 
Регистрация: 19.05.2007
Сообщений: 9
По умолчанию

Немного поэкспериментировал и вот что получилось
что так:

PHP код:
select count(distinct(t.em)) as cr from
FROM 
(select email as em from object where email<>''
 
union all
 select email 
as em from job_list where email<>''
 
union all
 select from_email 
as em from send_message where from_email<>''
) as t
LEFT JOIN send_ignore_list_email 
as s ON t.em s.email
WHERE s
.email IS NULL 

что так:

PHP код:
select count(distinct(t.em)) as cr from
  
(select email as em from object where email<>''
   
union all
   select email 
as em from job_list where email<>''
   
union all
   select from_email 
as em from send_message where from_email<>''
  
) as t where t.em not in (SELECT email FROM send_ignore_list_email

Время выполнения запроса примерно 2.4 с

А вот если убрать у первой и второй конструкции подавление дублей distinct
то у обоих запросов время выполнения 0,76 с

Т.е. дело в операторе distinct

Его как то можно заменить или оптимизировать?
sanich_23 вне форума Ответить с цитированием
Старый 06.11.2014, 22:18   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Убери all из union all и distinct
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.11.2014, 00:36   #6
sanich_23
 
Регистрация: 19.05.2007
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Убери all из union all и distinct
Да, спасибо. Чуть быстрее стал выполняться 1.8 с а было 2.4 с

PHP код:
SELECT count(t.em) as cr
FROM 
(select email as em from object where email<>''
 
union
 select email 
as em from job_list where email<>''
 
union
 select from_email 
as em from send_message where from_email<>''
) as t
LEFT JOIN send_ignore_list_email 
as s ON t.em s.email
WHERE s
.email IS NULL 
Еще что то можно сделать?
sanich_23 вне форума Ответить с цитированием
Старый 07.11.2014, 02:56   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,767
По умолчанию

Можно попробовать left join с is null переписать на not exists.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация запроса russian-stalker SQL, базы данных 1 11.10.2011 13:17
Оптимизация запроса Spyhunter1983 SQL, базы данных 2 05.10.2011 15:24
Оптимизация запроса stalsoft SQL, базы данных 0 05.07.2011 14:51
оптимизация запроса pray_driver SQL, базы данных 3 13.12.2010 15:40
Оптимизация запроса za4ot SQL, базы данных 0 11.06.2010 09:24