powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса not in (select ...
11 сообщений из 11, страница 1 из 1
Оптимизация запроса not in (select ...
    #38797560
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Прошу помочь в оптимизации запроса:

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 сек
Проблема имеено в последней выборке
Код: sql
1.
as t where t.em not in (SELECT email FROM send_ignore_list_email)



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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 сек

Помогите пожалуйста
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797565
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно задача из первой выборки email вычесть вторую выборку email
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797751
Фотография Станислав Клевцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСобственно задача из первой выборки email вычесть вторую выборку email
Обратите внимание на конструкции ниже :

Они позволяют от результата одного запроса вычесть (отбросить) результат другого.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM table1
MINUS
SELECT * FROM table2

второй вариант такой

SELECT * FROM table1
WHERE ...
AND NOT EXISTS (SELECT * FROM table2)
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797777
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав КлевцовавторСобственно задача из первой выборки email вычесть вторую выборку email
Обратите внимание на конструкции ниже :

Они позволяют от результата одного запроса вычесть (отбросить) результат другого.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT * FROM table1
MINUS
SELECT * FROM table2

второй вариант такой

SELECT * FROM table1
WHERE ...
AND NOT EXISTS (SELECT * FROM table2)



Оператора MINUS в mysql нету.

Второй вариант что -то не работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 EXISTS (SELECT email FROM send_ignore_list_email)



Пишет ошибку: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS (SELECT email FROM send_ignore_list_email)' at line 8

Не могу понять
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797789
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanich,

Код: sql
1.
2.
3.
4.
SELECT t1.*
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.email_id = t2.email_id
WHERE t2.email_id IS NULL
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797828
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcsanich,

Код: sql
1.
2.
3.
4.
SELECT t1.*
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.email_id = t2.email_id
WHERE t2.email_id IS NULL



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

Код: sql
1.
2.
3.
4.
SELECT t1.*
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.email_id = t2.email_id
WHERE t2.email_id IS NULL



что так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
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

Его как то можно заменить или оптимизировать?
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797849
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanich,

покажите результат вот такого запроса:

Код: sql
1.
2.
3.
4.
5.
EXPLAIN
SELECT t1.*
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.email_id = t2.email_id
WHERE t2.email_id IS NULL
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38797948
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcsanich,

покажите результат вот такого запроса:

Код: sql
1.
2.
3.
4.
5.
EXPLAIN
SELECT t1.*
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.email_id = t2.email_id
WHERE t2.email_id IS NULL



Чуток оптимизировал до вида:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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



Стал выполнятся за 1.8 сек, а было 2.4 сек.
Но всеравно не быстро

Теперь

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN
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



Показывает следующее:

http://SSMaker.ru/1e23b31a/
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38798072
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanich,

наверное вот так грамчик быстрее будет.
Скол-ко вообше count(t.em) в результате получается?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT count(t.em) as cr
FROM 
(select email as em from object where email<>''
LEFT JOIN send_ignore_list_email as s ON t.em = s.email
WHERE s.email IS NULL
 union
 select email as em from job_list where email<>''
LEFT JOIN send_ignore_list_email as s ON t.em = s.email
WHERE s.email IS NULL
 union
 select from_email as em from send_message where from_email<>''
LEFT JOIN send_ignore_list_email as s ON t.em = s.email
WHERE s.email IS NULL
) as t



А вообше -- этот запрос частоли надо запускать?
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38798134
sanich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbc,

106000

наверное вот так грамчик быстрее будет. - это как?
...
Рейтинг: 0 / 0
Оптимизация запроса not in (select ...
    #38798480
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanichДобрый день.
Прошу помочь в оптимизации запроса:

Код: sql
1.
2.
3.
4.
5.
6.
7.
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)





Подзапрос not in (SELECT email FROM send_ignore_list_email) задвинь внутрь каждого запроса, объединённого по union all.

А ещё лучше считать сразу count(distinct(t.em)).

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
   (select count(distinct(email)) as c1 from object where email <> "" and email not in (SELECT email FROM send_ignore_list_email))
   +
   ( select  count(distinct(email)) as c2 from job_list where email<>'' and email not in (SELECT email FROM send_ignore_list_email))
   +
   ( select count(distinct(from_email) as c3 from send_message where from_email<>'' and from_email not in (SELECT email FROM send_ignore_list_email))
;  
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса not in (select ...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]