SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.04.2013 12:38:11

noneim
Участник
Зарегистрирован: 01.04.2013
Сообщений: 1

Вложенный select

Выполняю запрос

Код:

 
select table1.* from table1 
where 
table1.ip in (select ip from table2 where ip like '%1%' ) 
LIMIT 1000

Так вот, сами по себе оба запроса выполняются быстро (менее 0.01 сек), а вот такой вложенный запрос - порядка 20 сек. Варианты с LEFT JOIN тоже выполняются небыстро (более секунды).

Думаю что это связано с тем, что  (select ip from table2 where ip like '%1%' ) выполняется при каждой проверке условия (или нет?)

Тогда надо как то закешировать подзапрос, чтоб оператор IN выполнял выборку и уже сформированного заранее списка значений, чтоб это всё быстро обрабатывалось.

LEFT JOIN ещё не подходят потому, что понадобится такой запрос:

Код:

 
select table1.* from table1 
where 
table1.ip in (select ip from table2 where ip like '%1%' ) 
OR table1.ip in (select ip from table3 where ip like '%1%' ) 
LIMIT 1000

Отредактированно noneim (01.04.2013 12:47:26)

Неактивен

 

#2 01.04.2013 14:20:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Вложенный select

noneim написал:

Думаю что это связано с тем, что  (select ip from table2 where ip like '%1%' ) выполняется при каждой проверке условия (или нет?)

Да. Это старая бага (исправлена в mariadb 5.3)


Разбивайте запрос на 2 подставляйте значения ip в явном виде или переписывайте через join.

Кстати, зачем вам left join в данном случае? Достаточно простого join.


Относительно последнего запроса:

select table1.* from table1 join
(select ip from table2 where ip like '%1%' union
select ip from table3 where ip like '%1%' ) t using(ip)
LIMIT 1000

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson