mysql查询使用where子句有2400万行

时间:2013-04-10 16:44:12

标签: mysql

 SELECT DISTINCT `Stock`.`ProductNumber`,`Stock`.`Description`,`TComponent_Status`.`component`, `TComponent_Status`.`certificate`,`TComponent_Status`.`status`,`TComponent_Status`.`date_created` 
FROM Stock , TBOM , TComponent_Status
WHERE  `TBOM`.`Component` = `TComponent_Status`.`component` 
AND `Stock`.`ProductNumber` = `TBOM`.`Product`  

基本上表TBOM有:

24,588,820行

查询速度非常慢,我不太清楚我能做些什么才能让它变得更好。我已经在查询中索引了所有其他表,但TBOM在列中有一些重复,所以我甚至无法运行该命令。我有点困惑。

2 个答案:

答案 0 :(得分:2)

首先,索引以下字段:

TBOM.Component
TBOM.Product 
TComponent_Status.component   
Stock.ProductNumber

并非所有上述索引都是必要的(例如,最后两个),但这是一个良好的开端。

另外,如果您不完全需要,请删除DISTINCT

答案 1 :(得分:0)

我唯一能想到的就是在你的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子句将被优化,并且由于片段已经是索引的一部分,因此也是不同的。

但是,您目前如何拥有它,如果您有一个“组件”的10个TBOM条目,并且该组件有100个更改,您现在在结果集中有10 * 100或1,000个条目。拿这个,跨越2400万,它绝对不会好看。