我试图对一个变量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;