繁体   English   中英

如何使用多列索引优化MySQL查询?

[英]How to optimize the MySQL query using multiple-column indexes?

我是MySQL索引的新手。 我正在尝试为web_products表创建索引。 我创建了索引IsDataActive_IsVerified_IsExpired_Price_Sale以优化以下查询;

SELECT 
MAX(Price_Sale) as maxColumn
FROM
`web_products` `t`
WHERE
IsDataActive = 1 AND IsVerified = 1
    AND IsExpired = 0

当我使用Explain分析查询时,将得到最好的结果"Select tables optimized away"

我有另一个查询,表现非常差。 web_products表可能包含数百万种产品。 执行下面的查询需要几分钟的时间;

SELECT 
COUNT(P.BrandID)
FROM
web_products AS P
WHERE
P.OriginalItemID IS NULL
    AND P.IsDataActive = 1
    AND P.IsExpired = 0
    AND P.IsVerified = 1;

BrandID是FK到brands表。 这是上述查询的解释分析 如何优化以上查询?

更新1

答案中提到的Index正适合上述查询。 我可以在不到0.200毫秒的时间内得到结果。

我已经修改了第二个查询并将MerchantID添加到索引,现在执行下面的查询需要1秒钟。 说明显示rows examinedrows examined数为88331 有什么办法可以将执行时间缩短到毫秒?

SELECT 
P.BrandID, COUNT(P.BrandID) as Count, B.Name
FROM
web_products AS P
    inner join
web_brands as B ON P.BrandID = B.ID
    INNER JOIN
web_merchants M ON P.MerchantID = M.ID
    LEFT JOIN
web_products_features F ON P.ID = F.Product_ID
WHERE
P.OriginalItemID IS NULL
    AND P.IsDataActive = 1
    AND P.IsExpired = 0
    AND P.IsVerified = 1
    AND B.IsDataActive = 1
group by P.BrandID
order by Count desc
Limit 100

这两个查询的最佳索引可能是:

web_products(IsDataActive, IsExpired, IsVerified, OriginalItemId, BrandId, Price_Sale)

前三列的顺序并不重要。 这应该对第一个查询有效,因为它是一个覆盖索引。 如果它影响性能,则使用两个索引并从该索引中删除Price_Sale

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM