我唯一能真正想到的就是在您的 Stock 表上有一个索引
(ProductNumber, Description)
这可以通过两种方式提供帮助。由于您只在查询中使用这两个字段,因此引擎不需要转到每个股票记录的完整数据行,因为这两个部分都在索引中,它可以使用它。此外,您正在执行 DISTINCT,因此拥有可用于帮助优化 DISTINCTness 的索引也应该有所帮助。
现在,时间的另一个问题。由于您正在从库存到产品再到产品状态进行区分,因此您要求所有 2400 万个 TBOM 项目(假设材料清单),并且每个 BOM 组件都可以创建多个状态,您将获得每个组件的每个 BOM 更改。
如果您真正要寻找的是任何组件项的最新更改,您可能希望反向执行...类似...
SELECT DISTINCT
Stock.ProductNumber,
Stock.Description,
JustThese.component,
JustThese.certificate,
JustThese.`status`,
JustThese.date_created
FROM
( select DISTINCT
TCS.Component,
TCS.Certificate,
TCS.`staus`,
TCS.date_created
from
TComponent_Status TCS
where
TCS.date_created >= 'some date you want to limit based upon' ) as JustThese
JOIN TBOM
on JustThese.Component = TBOM.Component
JOIN Stock
on TBOM.Product = Stock.Product
如果是这种情况,我会确保在组件状态表上有一个索引,例如( date_created, component, certificate, status, date_created )作为索引。这样,WHERE 子句将被优化,并且 distinct 也将被优化,因为片段已经是索引的一部分。
但是,如果您目前拥有它,如果单个“组件”有 10 个 TBOM 条目,并且该组件有 100 个更改,那么您的结果集中现在有 10 * 100 或 1,000 个条目。拿这个跨越2400万,它肯定不会好看。