2010-01-18 4 views
0

У меня возникли некоторые основные вопросы, с помощью оператора SQL, следующее выражение вызывает такое большое напряжение к двигателю MySQL это в значительной степени зависания:Очень медленный SQL заявление

select c.title, c.initial, c.surname, c.labelno, c.email, br1.bookingdate 
from explorer.booking_record br1 
inner join explorer.client c 
on c.labelno = br1.labelno 
and email not like '' 
where br1.bookingdate >= '2009-01-01' 
and br1.bookingdate < '2009-01-31' 
and c.labelno Not In (Select labelno from explorer.booking_record br2 where br2.labelno = br1.labelno and br2.bookingdate >= '2010-01-01' and br2.bookingdate < '2010-01-31') 

Я пробовал несколько вариантов на то же самое, без объединений и двух подзапросов, добавив «порядок», как указано в документации. На самом деле не так много записей в базе данных, book_record имеет ~ 500 000 записей, а клиент имеет ~ 450 000. Если я запустил запрос, обычно он получает около 20 результатов через 70-80 секунд, но это приводит к тому, что служба переходит в состояние, подобное циклу.

Любой совет будет очень благодарен.

Daniel.

+0

Вы указали указатели на labelno & bookingdate (или сложный на обоих)? –

+0

На самом деле у меня нет никакого контроля над самой базой данных, поэтому я не мог сказать вам - я буду изучать его, поскольку индексы, похоже, являются общей темой здесь –

+0

Хорошо, что у меня был взгляд, а labelno - индекс в клиенте, но указатель в booking_record находится на bookingref (фактически не используется в этом запросе) –

ответ

0

Убедитесь, что следующие столбцы индексируются:

explorer.booking_record.labelno 
explorer.booking_record.bookingdate 
explorer.booking_record.labelno 
explorer.client.labelno 
explorer.client.email 

Теперь попробуйте следующий запрос:

select c.title, c.initial, c.surname, c.labelno, c.email, br1.bookingdate 
from explorer.booking_record br1 
left outer join explorer.booking_record br2 on br2.labelno = br1.labelno 
    and br2.bookingdate >= '2010-01-01' and br2.bookingdate < '2010-01-31' 
inner join explorer.client c on c.labelno = br1.labelno and c.email <> '' 
where br1.bookingdate >= '2009-01-01' 
    and br1.bookingdate < '2009-01-31' 
    and br2.labelno is null 
+0

. Это сработало отлично, хотя только для book_record.labelno требуется индекс для этого, чтобы он работал - теперь он исчез с n секунд до 0,14 с. Благодаря! –

2

НЕ НРАВИТСЯ И НЕ В, скорее всего, преступники здесь.

Изменить NOT LIKE<>. Здесь вам не нужно никакого поведения «LIKE», так как вы не используете подстановочные знаки, поэтому вы можете просто изменить это на «не равный» оператор.

Рядом с этим вы уже ознакомились с планом выполнения и выяснили, были ли созданы индексы столбцов, которые могут использовать индекс?

+1

Он уже использует коррелированный подзапрос, так как он ссылается на br1 в этом подзапросе. –

+0

Изменил это, но он немного изменился, посмотрит на индексы –

0

Вы уже указали индексы на поля где? Не в и не нравится, как известно, медленно, поэтому, возможно, вы можете избежать этих утверждений.

0

'Не' имеет тенденцию быть медленным. Попробуйте что-то вроде этого, убедитесь, что labelno индексируется в обеих таблицах.

select c.title, c.initial, c.surname, c.labelno, c.email, br1.bookingdate 
from explorer.booking_record br1 
inner join explorer.client c 
on c.labelno = br1.labelno 
and email not like '' 
where br1.bookingdate >= '2009-01-01' 
and br1.bookingdate < '2009-01-31' 
and Not Exists (Select 1 from explorer.booking_record br2 where br2.labelno = br1.labelno and br2.bookingdate >= '2010-01-01' and br2.bookingdate < '2010-01-31') 
Смежные вопросы