簡體   English   中英

具有COUNT個性能的MySQL JOIN

[英]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.idp.brand_idp.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM