[英]MySQL JOIN with COUNT performance
我最近一直在努力優化我們的數據庫,以增加它的可擴展性,並運行到的東西,我一直無法進一步優化,但感覺應該有什么事情我可以做的更好。 我目前有:
SELECT b.id, b.title, COUNT(p.id) AS count
FROM brands b
LEFT JOIN products p ON b.id = p.brand_id
WHERE p.status = 'Accepted'
GROUP BY b.id
我可能會在進一步的過濾器產品中添加額外的WHERE
子句,因此我已經排除了在每個品牌記錄中保留可接受的產品數量的方法(無論如何這都是很糟糕的做法)。
這些表是MyISAM
,對b.id
, p.brand_id
和p.status
進行了索引。 擁有約500,000種產品和約1,000個品牌,它的使用時間約為2.5秒。 我可以做些更好的事情來獲得帶有其產品數量的品牌列表,或者對於我想要達到的目標而言,時間范圍實際上是否合理?
對於此查詢:
SELECT b.id, b.title, COUNT(p.id) AS count
FROM brands b LEFT JOIN
products p
ON b.id = p.brand_id
WHERE p.status = 'Accepted'
GROUP BY b.id;
我會建議針對products(status, brand_id)
和brands(id, title)
索引。
但是,您的WHERE
LEFT JOIN
變為INNER JOIN
,因此您應該對此進行具體說明。 也許您真的打算:
SELECT b.id, b.title, COUNT(p.id) AS count
FROM brands b LEFT JOIN
products p
ON b.id = p.brand_id AND p.status = 'Accepted'
GROUP BY b.id;
這將返回計數為零的品牌。 原始版本沒有(盡管LEFT JOIN
建議您這樣做)。
如果是這樣,則關聯的子查詢可以具有更好的性能:
SELECT b.id, b.title,
(SELECT COUNT(*)
FROM products p
WHERE b.id = p.brand_id AND p.status = 'Accepted'
) AS count
FROM brands b;
此查詢的最佳索引是products(brand_id, status)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.