2010-01-18 68 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') 

我已經試過上一些變化同樣,沒有連接和兩個子語句,按照文檔的建議添加'order by'。數據庫中實際上並沒有那麼多記錄,booking_record有大約50萬條記錄,客戶端有450,000條記錄。如果我讓查詢運行,它通常會在70-80秒後得到20個結果,但這會導致服務進入循環狀態。

任何意見將不勝感激。

丹尼爾。

+0

您是否在labelno&bookingdate(或兩者上都有複雜的一個)上定義了索引? – 2010-01-18 12:04:04

+0

我實際上沒有對數據庫本身的任何控制,所以我不能告訴你 - 我會看看它作爲索引看起來是一個普通的話題在這裏 – 2010-01-18 12:33:50

+0

好吧,我已經看了一下,labelno是一個索引在客戶端,但在booking_record中的索引是在bookingref(實際上並未在此查詢中使用) – 2010-01-18 12:41:38

回答

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

這工作完美,儘管只有booking_record.labelno需要索引這個工作 - 現在從n秒到0.14s。謝謝! – 2010-01-18 14:46:30

2

不喜歡和不喜歡這裏最有可能的罪魁禍首。

NOT LIKE更改爲<>。在這裏你不需要任何'LIKE'行爲,因爲你沒有使用任何通配符,所以你可以簡單地將它改爲'不等於'運算符。

接下來,您是否已經查看了執行計劃,並調查了是否在可以使用索引的列上創建了索引?

+1

他已經在使用相關子查詢,因爲他在該子查詢中引用了br1。 – 2010-01-18 12:07:15

+0

改變了這一點,但它沒有什麼區別,將看看索引 – 2010-01-18 12:35:40

0

你已經把索引放在where字段上了嗎?不在和不喜歡被認爲是緩慢的,所以也許你可以避免這種說法。

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')