我是新來的查詢優化,所以我看了很多文章,看了YouTubes和東西,但我仍然無法弄清楚。mySQL查詢隨機需要很長時間來執行
的事情是我有這個疑問,我要執行我的API:
SELECT req_id,follow_requests.insta_id as id,caption,follow_requests.male,
users.name,users.profile_pic
FROM follow_requests
INNER JOIN users ON follow_requests.insta_id = users.insta_id
WHERE (remaining_follow>0 && req_id<='574989')
AND NOT EXISTS
(
SELECT *
FROM follows
WHERE follows.req_id=follow_requests.req_id
AND follows.follower_insta_id='3134816134'
)
ORDER BY req_id DESC
LIMIT 20
所以我記錄我的數據庫和消化表明這個人是吃了我的資源 的一些實例的+ 42%這個查詢看起來像300秒,它有平均20秒!(他們卡住發送數據狀態) 所以我試圖改變它更好(不是我真的知道我在做什麼:) 和我把它改成了這個
SELECT fr.req_id, fr.insta_id as id, fr.caption, fr.male, u.name,
u.profile_pic, fr.date, fr.remaining_follow
FROM follow_requests AS fr
INNER JOIN users AS u ON fr.insta_id=u.insta_id
WHERE fr.remaining_follow>0
AND fr.insta_id!=3134816134
AND NOT EXISTS
(
SELECT *
FROM follows as f
WHERE f.req_id=fr.req_id
AND f.follower_insta_id='3134816134'
)
ORDER BY fr.date DESC
LIMIT 20
奇怪的是,前幾次運行沒問題!像從0.1秒到0.7s 在測試運行 但我去拉伸了一下,並回來完成它,這也被卡住了+200,300秒,但在排序狀態這一次 我檢查查詢與解釋,我注意到它不使用日期索引! 如果我只是刪除'由'部分查詢它變得真的很快〜0.2s
任何想法?
順便說一下,幾乎所有的列索引,並按照表中有其他2M行有像+ 100K
很抱歉,如果我不能解釋它好還是我錯過了給你一些重要的信息,我米只是新)
我會很感激,如果你能以某種方式解釋它,而不是錯過了一個新手能理解重要的細節:)提前
感謝
= - = - = - = - = - = - =更新1 = - = - = - = - = - = - =
感謝你們的幫助我達到現在這個查詢這是一次有效的,但 我不得不改變整個事情一點點,但它可能仍然有問題
SELECT follow_requests.req_id, follow_requests.insta_id as id,
caption, follow_requests.male, users.name,users.profile_pic
FROM follow_requests
INNER JOIN users ON follow_requests.insta_id = users.insta_id
LEFT OUTER JOIN follows ON follows.req_id = follow_requests.req_id
AND follows.follower_insta_id = '3134816134'
WHERE follow_requests.remaining_follow >0
AND follow_requests.insta_id != 3134816134
AND (follows.follower_insta_id != 3134816134 || follows.follower_insta_id is null)
ORDER BY follow_requests.date DESC
LIMIT 20
嗯,首先,我需要說我沒有寫原始查詢(第1),我不明白所有它自己:/但主程序員現在是不可及的,我必須佔據他的位置或整個項目將失敗
about問題是每個人都可以提交一個insta_id的多個請求,但應該只返回其中的一個 主要代碼和@Kickstart代碼(這是優化版本的原始一個與大約10秒響應時間)是否正確(由於某種原因,我不明白 但我的代碼返回多個insta_id實例(不同req_id)
並且alsocould一些身體啓發我爲什麼第一個查詢做得這麼差?
您的查詢缺少_follows.req_id IS NULL_檢查,這是非常重要的。 LEFT OUTER JOIN將嘗試進行連接,但即使未找到匹配項,仍會返回一行,並將不匹配的表中的列設置爲NULL。因此,如果你做了一個LEFT OUTER JOIN,那麼檢查一個必須在那裏的列是NULL,然後你從第一個表中返回沒有第二個表上匹配的行。 – Kickstart
@Kickstart是的,我故意這樣做,我的意思是這兩個表的作品是這樣的,用戶1在follow_request中提交他的請求,用戶2可以做到這一點,用戶操作在後面提交,用戶2不應該看到,用戶再次請求(只能爲每個用戶完成一次),所以爲什麼我保持爲空意味着它不會顯示任何用戶已經完成至少一次的請求,但我需要向其他用戶顯示或他們永遠不會完成,但我不是100%確定,如果我說的是正確的或不); –
'後續'有'INDEX(follower_insta_id,req_id)'? –