在MySQL中按组求和时使用索引

时间:2014-04-22 01:39:30

标签: mysql indexing group-by sum

我试图对一个变量fPurchaseAmt求和,它是一个浮点数,由iCompanyID分组,它是一个BigInt。我的表Trans_smp有1500万行,还有大约10个其他列。为了提高性能,我在iCompanyID和另一个变量iBrandID:

上添加了一个索引
create index idxCompBrand on Trans_smp (iCompanyID, iBrandID);

没问题。我在创建索引之前和之后运行了以下代码:

select iCompanyID, count(fPurchaseAmt) FROM Trans_smp GROUP BY iCompanyID;

在创建索引之前,它在大约34秒内运行,在创建索引后,它在大约14秒内运行。

然后我运行了我想要的代码:

select iCompanyID, sum(fPurchaseAmt) FROM Trans_smp GROUP BY iCompanyID;

在创建索引之前,它在大约33秒内运行,与计数大致相同。创建索引后,它会失败或需要很长时间。最近一次我尝试了,我等了4个小时,但没完成。为了使它工作,我尝试创建第二个索引,仅限于iCompanyID:

create index idxComp on Trans_smp (iCompanyID);

在创建第二个索引后,我再次尝试,但在不到4个小时内没有完成,所以我拔掉了插头。

创建第二个索引后,我再次尝试使用以下代码:

select iCompanyID, sum(fPurchaseAmt)
  FROM Trans_smp
  ignore index idxCompBrand
  ignore index idxComp
  GROUP BY iCompanyID
  ;

再一次,在大约33秒内没有问题。

任何人对我的问题是什么有什么想法,以及如何避免它?显然我可以使用“忽略索引”方法,但我希望在整套上开始使用这个和类似的步骤,有3.5亿行,所以我希望能够使用索引。

以下是“show create table”的完整结果:

create table Trans_smp (
  aTrans BigInt bigint(20) unsigned not null default '0'
  , iCustID BigInt(20) unsigned default null
  , iChainID SmallInt(5) unsigned default null
  , iDeptID SmallInt(5) unsigned default null
  , iCategoryID BigInt(20) unsigned default null
  , iCompanyID BigInt(20) default null
  , iBrandID BigInt(20) unsigned default null
  , dTransDt date default null
  , fProductSz float default null
  , cProductMeasure char(8) default null
  , iPurchaseQty MediumInt(9) default null
  , fPurchaseAmt float default null
  , key idxCompBrand (iCompanyID, iBrandID)
  , key idxComp (iCompanyID)
  )
  engine=InnoDB default charset=latin1;

0 个答案:

没有答案