2014-03-04 28 views
-1

所以我的查詢確實有效,但需要大約25-30秒才能完成。我想知道如果我能用這個查詢來做什麼來優化它,所以它可能運行得更快一點?我自己做了一些,但最多隻能跑25秒。任何我可以優化這條SQL語句的方法?

任何建議或幫助?即使只是一個正確的方向點將不勝感激。

SELECT * FROM `earnfrom` WHERE (
      `active` = ? AND `type` = ? 
    ) 
    AND `curdaily` <= `dailyclick` AND `clicks` <= `totalclick` AND `id` NOT IN (
     SELECT `earnid` FROM `earnedby` WHERE `userid`= ? 
    ) 
    AND `userid` != ? AND (
     SELECT `points` FROM `users` WHERE `id` = `userid` 
    ) >= `cpc` ORDER BY `cpc` DESC, RAND()") 

這裏的表方案:

表earnedby: earnedby

表earnfrom: earnfrom

表用戶: prntscr.com/2xpmre

DB具有2711具有相同類型的鏈接(Faceb ook喜歡),它需要讓那些還沒有被喜歡的人(不是IN(SELECT * FROM`....),但是一個星期以來沒有成爲一種痛苦(因爲我每天獲得超過210個用戶)

所以查詢應該這樣做:

選擇從數據庫的鏈接,驗證是否漲停點擊是平等的,選擇那些誰的arent相等,驗證是否在另一個表(earnedby)的存在id earnid,如果沒有那一個應該是不錯的,如果存在就意味着它其實已經很喜歡,或者有厘金

感謝您關注我的問題〜當問題

+0

沒有查詢計劃 - >沒有幫助。 – user2864740

+0

添加了更好的描述〜 – c0d3x

+0

誰在關心描述,什麼是查詢計劃*? – user2864740

回答

0

通過適當的連接將子查詢從WHERE部分移動到FROM部分。

E.g.像這樣

SELECT * FROM `earnfrom` 
    join `users` on `users`.`id` = `earnfrom`.`userid` 
    left join (select `earnid` from FROM `earnedby` WHERE `userid`= ?) sub ON sub.`earnid`=`earnfrom`.`userid` 
WHERE (
     `active` = ? AND `type` = ? 
) 
AND `curdaily` <= `dailyclick` 
AND `clicks` <= `totalclick` 
AND sub.`earnid` is NULL 
AND `userid` != ? AND `users`.`points` >= `cpc` 
ORDER BY `cpc` DESC, RAND()") 
+0

謝謝這個工作很好,我希望我可以給你一個擁抱先生:) – c0d3x

+0

不客氣。 :-)不要忘記接受答案是正確的。 – StanislavL

+0

完成,謝謝你,使用你+改變!=到<>我的查詢現在運行在1秒以內。 :) – c0d3x

0

我不是MySQL專家,所以我使用Percona Query Adviser在實施前分析我的查詢。它是一個開始的好地方。

https://tools.percona.com/query-advisor/ 
+0

Thankyou,這實際上有點幫助! – c0d3x