這裏最大的效率殺手是相關子查詢:
(SELECT CONCAT(name, " ", surname)
FROM pt_users us
WHERE us.uID = ph.uID) name_surname
...和:
ifnull((SELECT SUM(vote)
FROM pt_votes vo
WHERE vo.pID = ph.pID),0) points,
每個將每一行,使得它過去WHERE
條款運行一次。
要消除相關的子查詢,您需要加入pt_votes
和pt_users
表。另外,因爲你總結的票數,你需要GROUP BY
,這意味着你需要真的擺脫SELECT *
正如已經在評論中所建議的。
查詢將如下所示。當你確定哪些pt_photos
列,你需要確保將它們添加到列表GROUP BY
:
SELECT
pt_photos.pID,
pt_photos.uID,
pt_photos.this,
pt_photos.that,
CONCAT(pt_users.name, ' ', pt_users.surname) AS name_surname,
IFNULL(SUM(pt_votes.vote), 0) AS points
FROM pt_photos
JOIN pt_users ON pt_photos.uID = pt_users.uID
LEFT JOIN pt_votes ON pt_photos.pID = pt_votes.pID
WHERE 1
GROUP BY
pt_photos.pID,
pt_photos.uID,
pt_photos.this,
pt_photos.that
如果您的查詢真的有WHERE 1
條款,你可以將其刪除。
你可以用特定字段替換*嗎?當您在查詢上執行'EXPLAIN'時會發生什麼?有沒有可以創建/優化的任何鍵? – DevlshOne
你可以添加表結構,它可以是有用的 – CaveCoder
ifnull((SELECT SUM(vote)FROM pt_votes vo WHERE vo.pID = ph.pID),0) 我懷疑這可以被左連接替換,會加速thigs – CaveCoder