簡體   English   中英

如何優化相關子查詢?

[英]How to optimize correlated subquery?

我有針對MySQL運行的此查詢:

SELECT DISTINCT tp.parts_group as PartsGroup, tpf.code as FeatureCode, CONVERT(tpf.market_id, char) as MarketID
FROM jpt_product_feature tpf
INNER JOIN jpt_product tp
ON tpf.product_id = tp.id
INNER JOIN jpt_product_model tpm
ON tp.model_id = tpm.id
JOIN ModelImport mi
ON tpm.Code = mi.ModelCode
WHERE NOT EXISTS (
      SELECT 1 
      FROM FeatureSequence fs
      WHERE tp.parts_group = fs.PartsGroup
      AND tpf.code = fs.FeatureCode
      AND (tpf.market_id = fs.MarketID or tpf.market_id is null)
) 
ORDER BY PartsGroup, FeatureCode, MarketID

它可以在我的PC上運行38秒,考慮到跨多個表的大量行,這很好。 但是,在功率較小的VM上運行時,此查詢運行了大約2個小時,然后因FATAL ERRORFATAL ERROR

這是我的索引:

CREATE INDEX idxFeatureSequencePartsGroup ON FeatureSequence (PartsGroup); 
CREATE INDEX idxToyProductPartsGroup ON jpt_product (parts_group); 
CREATE INDEX idxToyProductFeature ON jpt_product_feature (code);
CREATE INDEX idxFeatureSequenceFeatureCode ON FeatureSequence (FeatureCode); 
CREATE INDEX idxToyProductFeatureMarketID ON jpt_product_feature (market_id);
CREATE INDEX idxFeatureSequenceMarketID ON FeatureSequence (MarketID); 

我們正在努力增強虛擬機,但是與此同時,我該怎么做才能加快此查詢的速度,對其進行優化,使其效率更高? 如果它可以極大地加快查詢速度,我什至願意接受異國情調的/模糊的方法。 或者,如果我缺少您認為應該擁有的索引,那可能是一個簡單的解決方案。

相關查詢的效率往往比不相關的查詢低(如果可能的話)。 在這種情況下,我將嘗試以下替代方法:

SELECT DISTINCT tp.parts_group as PartsGroup, tpf.code as FeatureCode, CONVERT(tpf.market_id, char) as MarketID
FROM jpt_product_feature tpf
INNER JOIN jpt_product tp ON tpf.product_id = tp.id
INNER JOIN jpt_product_model tpm ON tp.model_id = tpm.id
INNER JOIN ModelImport mi ON tpm.Code = mi.ModelCode
LEFT JOIN (
      SELECT DISTINCT 1 AS matchCheck
         , fs.PartsGroup AS fsPartsGroup
         , fs.FeatureCode AS fsFeatureCode
         , fs.MarketID AS fsMarketID
      FROM FeatureSequence fs
) AS fs ON tp.parts_group = fs.fsPartsGroup
      AND tpf.code = fs.fsFeatureCode
      AND (tpf.market_id = fs.fsMarketID OR tpf.market_id is null)
WHERE fs.matchCheck IS NULL
ORDER BY PartsGroup, FeatureCode, MarketID
;

在不知道數據分布細節的情況下,很難說這是否會更快(在某些情況下,相關子查詢是最佳選擇)。 但這是我要嘗試的第一件事。 如果FeatureSequence與所涉及的其他表相比相對較大,則相關查詢可能仍然更好(相對於一個大表,許多小的命中還是一個大命中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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