我有這個查詢(下),而它的工作,我想知道它是否是最好的,因爲它將違背數千記錄。我會盡力解釋我能做到的最好。寫這個查詢的最佳方法是什麼?幾個聯接
SELECT items.*,
p.file AS item_pic,
i_f.id AS favorite_id,
COALESCE(f.favorite_count, 0) AS favorite_count,
COALESCE(b.num_buys, 0) AS num_buys,
COALESCE(c.comment_count, 0) AS comment_count
FROM items i
INNER JOIN (SELECT file,
item_id
FROM item_pics
ORDER BY item_pics.id ASC) AS p
ON p.item_id = i.id
LEFT JOIN (SELECT COUNT(*) AS favorite_count,
item_id
FROM item_favorites
GROUP BY item_id) AS f
ON f.item_id = i.id
LEFT JOIN (SELECT COUNT(*) AS num_buys,
item_id
FROM purchases
GROUP BY item_id) AS b
ON b.item_id = i.id
LEFT JOIN (SELECT COUNT(*) AS comment_count,
item_id
FROM comments
GROUP BY item_id) AS c
ON c.item_id = i.id
LEFT JOIN item_favorites AS i_f
ON i.id = i_f.item_id
AND i_f.userid = '14'
GROUP BY i.id
LIMIT 0, 20
所以我們選擇數據庫中的項目。第一次加入是爲了一張照片(項目有多張照片,但我只想要一張)。
下加入是最喜歡的計數。每次用戶最喜歡的東西都會將其添加到表格收藏中,並提供一些信息,所以我只是想獲得該物品的收藏總數。
接下來是購買該項目的數量。幾乎與收藏夾一樣。
之後,它是徵求意見。再次,這就像購買和收藏數量。
最後的聯接是看是否登錄的用戶(ID 14),如果不是我用COALESCE返回0。
就像我所說的這一切工作正常已收藏了此項目,但它確實需要幾秒鐘加載約6700個項目和約180K行的表格上,每次只加載20個表格(我做了類似於Facebook/Twitter的滾動/加載)。索引已在所有表上正確設置。一旦這是完整/正確的,我想知道如何限制在過去七天購買的結果和購買數量(num_buys)的順序。
編輯:從結果可以解釋
我會做的第一件事就是爲每個表添加一個別名並適當地使用別名......這將使讀取查詢和加速幫助過程變得更容易:) –
pleasd添加'EXPLAIN' –
VMai
你應該問http://dba.stackexchange.com/ –