2016-11-21 60 views
-4

我正在做一個wp留言簿,我在某個地方犯了一個錯誤。起初,我試圖使用加入,但coud無法得到它的,因爲所有這些條件的正常工作,所以我寫了這個:如何解決慢sql查詢

$query = " 
     (select *, 
     (select count(cid) from ctable WHERE nid = vid) as posts, 
     (select timestamp from ctable where nid = vid order by timestamp desc limit 1) as lt, 
     (select count(vid) from ntable) as total 
     FROM ntable 
     )"; 

這也正是它supossed做的,但它是非常緩慢的。我知道我喊使用加入,但我不能弄明白。

回答

0

按我精通水平..try使用nolocks因爲我更新了你的查詢是,

$query = '(select *, 
     (select count(cid) from ctable with(nolock) WHERE nid = vid) as posts, 
     (select timestamp from ctable with(nolock) where nid = vid order by timestamp desc limit 1) as lt, 
     (select count(vid) from ntable with(nolock)) as total 
     FROM ntable with(nolock) 
     )'; 

和您所使用的排序與時間戳列和而不是使用getdate()-1(手段天數的舊數據,以便查詢將提高其性能。)

+0

返回錯誤。它不喜歡with(nolock)部分。 – Muhaha

0

連接查詢可能是這樣的(很難確定,因爲你沒有提供表定義)

select *,p.posts,t.ts,(select count(*) from ntable) total 
from ntable 
join (select vid,count(*) posts from ctable group by vid) p on p.nid = vid 
join (select vid,max(timestamp) ts from ctable group by vid) t on t.nid = vid 

但假設你有nid和vid的索引,我懷疑你是否會看到改進 - 我很想知道。

0

它沒有。問題不在於獲取足夠快的數據,而是在顯示(lt)時排序。這需要最長的時間。