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没有改进。这甚至需要更长的时间。我认为小组讨论需要更多的时间