如何使用多列索引优化 MySQL 查询?
How to optimize the MySQL query using multiple-column indexes?
我对 MySQL 索引还很陌生。我正在尝试为 web_products
table 创建索引。
我创建了索引 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
table 可能包含数百万种产品。执行以下查询需要几分钟;
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
table。这是上述查询的 Explain Analysis。
如何优化上述查询?
更新 1
答案中提到的Index
对上述查询非常有用。我能够在不到 0.200 毫秒内得到结果。
我已经修改了第二个查询并将 MerchantID
添加到索引中,现在执行以下查询需要 1 秒。解释显示 rows 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
。
我对 MySQL 索引还很陌生。我正在尝试为 web_products
table 创建索引。
我创建了索引 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
table 可能包含数百万种产品。执行以下查询需要几分钟;
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
table。这是上述查询的 Explain Analysis。
如何优化上述查询?
更新 1
答案中提到的Index
对上述查询非常有用。我能够在不到 0.200 毫秒内得到结果。
我已经修改了第二个查询并将 MerchantID
添加到索引中,现在执行以下查询需要 1 秒。解释显示 rows 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
。