Mysql 优化选择查询。使用联接,而不是在和子查询中

Mysql 优化选择查询。使用联接,而不是在和子查询中,mysql,query-performance,Mysql,Query Performance,我正在尝试优化以下查询: Select distinct cadData.id FROM CAD_Data cadData INNER JOIN Sales_Data SD ON cadData.CAD_Acct=SD.CAD_Acct and SD.List_Date = ( select max(List_Date) from Sales_Data where S

我正在尝试优化以下查询:

Select distinct cadData.id FROM CAD_Data cadData 
INNER JOIN Sales_Data SD 
ON cadData.CAD_Acct=SD.CAD_Acct 
and SD.List_Date = (
                    select max(List_Date) 
                    from Sales_Data 
                    where Sales_Data.CAD_Acct=cadData.CAD_Acct 
                   )  
where cadData.GMA_Tag = 101 
AND SD.List_Status NOT IN('ACT','OP','PEND','PSHO','pnd')  
ORDER BY cadData.id asc limit 10
这两个表都有超过1000万行。CAD_数据表由CAD_Acct和GMA_Tag列索引。除此之外,销售数据还通过CAD账户、GMA标签、列表日期、列表状态列进行索引。解释节目


我需要一些优化此查询的建议。提前感谢。

按照Jay的建议做,但也要提供以下索引:

Select distinct cadData.id 
FROM CAD_Data cadData 
INNER JOIN Sales_Data SD 
ON cadData.CAD_Acct=SD.CAD_Acct 
INNER JOIN
(
select CAD_Acct,max(List_Date) AS List_Date 
from Sales_Data
GROUP BY CAD_Acct 
) T
ON SD.List_Date=T.List_Date
AND T.CAD_Acct=cadData.CAD_Acct
where cadData.GMA_Tag = 101 
AND SD.List_Status NOT IN('ACT','OP','PEND','PSHO','pnd')  
ORDER BY cadData.id asc limit 10
SD:  INDEX(List_Date)
cadData:  INDEX(GMA_Tag, CAD_Acct, id)  -- in this order
Jay的重新表述要求从子查询开始。这意味着索引需要存在以不同的顺序处理表


请提供SHOW CREATE TABLE和一个新的解释。

确保这些索引已准备就绪:

ALTER TABLE `CAD_Data` ADD INDEX `cad_data_idx_tag_id` (`GMA_Tag`,`id`);
ALTER TABLE `CAD_Data` ADD INDEX `cad_data_idx_id` (`id`);
ALTER TABLE `CAD_Data` ADD INDEX `cad_data_idx_acct` (`CAD_Acct`);
ALTER TABLE `Sales_Data` ADD INDEX `sales_data_idx_status_acct` (`List_Status`,`CAD_Acct`);
创建它们后,请尝试运行此查询转换:

SELECT 
    cadData.id
FROM
    CAD_Data cadData
WHERE
    cadData.GMA_Tag = 101 
        AND EXISTS( SELECT 
            *
        FROM
            Sales_Data SD
                LEFT JOIN
            Sales_Data AS Sales_Data1 ON Sales_Data1.CAD_Acct = cadData.CAD_Acct
                AND Sales_Data1.List_Date < cadData.CAD_Acct
        WHERE
            cadData.CAD_Acct = SD.CAD_Acct
                AND SD.List_Status NOT IN ('ACT' , 'OP', 'PEND', 'PSHO', 'pnd')
                AND cadData.CAD_Acct IS NULL)
ORDER BY cadData.id ASC
LIMIT 10

请看这个。请特别注意有关查询性能的部分。然后,请回答您的问题,以提供我们需要帮助您的信息。在“内部联接”部分“内部联接”中,从Sales\u数据中选择maxList\u Date作为List\u Date,其中Sales\u Data.CAD\u Acct=cadData.CAD\u Acct表示未知列cadData.CAD\u Acct没有改进。这甚至需要更长的时间。我认为小组讨论需要更多的时间