I am wondering if there is a way to optimize this query:
SELECT Avg(selloff1),
YEAR(dt),
weekno
FROM bbproduct
GROUP BY YEAR(dt),
weekno
Table schema is:
CREATE TABLE `bbproduct` (
`id` bigint(20) NOT NULL,
`CUSTNO` decimal(6,0) unsigned zerofill NOT NULL default '000000',
`DEPTNO` decimal(1,0) unsigned zerofill NOT NULL default '0',
`PRODNO` decimal(4,0) unsigned zerofill NOT NULL default '0000',
`DT` date NOT NULL,
`ARDATE8N` decimal(8,0) unsigned zerofill NOT NULL default '00000000',
`STORENO` char(6) NOT NULL default '0',
`DAYCODE` decimal(1,0) unsigned zerofill NOT NULL default '0',
`WEEKNO` decimal(2,0) unsi开发者_运维技巧gned zerofill NOT NULL default '00',
`WKOFMONTH` decimal(2,0) unsigned zerofill NOT NULL default '00',
`QUANTITY` decimal(7,0) NOT NULL default '0',
`CARRYOVER` decimal(7,0) NOT NULL default '0',
`SELLOFF1` decimal(7,0) NOT NULL default '0',
`ONHANDQTY` decimal(7,0) NOT NULL default '0',
`KNOWNLOSS` decimal(7,0) NOT NULL default '0',
`ORDER` decimal(7,0) NOT NULL default '0',
`FAMLYCD` decimal(4,0) NOT NULL default '0',
`ROUTENO` decimal(4,0) NOT NULL default '0',
`AGENCYNO3N` decimal(3,0) NOT NULL default '0',
`RETURNS` decimal(7,0) NOT NULL,
`LASTUPDATE` datetime NOT NULL,
PRIMARY KEY (`CUSTNO`,`DEPTNO`,`PRODNO`,`DT`),
KEY `in_bbproduct_custnodeptnoprodno` (`CUSTNO`,`DEPTNO`,`PRODNO`),
KEY `in_bbproduct_deptnocustno` USING BTREE (`DEPTNO`,`CUSTNO`),
KEY `in_bbproduct_custno` USING BTREE (`CUSTNO`),
KEY `in_bbproduct_dt` USING BTREE (`DT`),
KEY `in_bbproduct_routeno` (`ROUTENO`),
KEY `in_bbproduct_selloff1` (`SELLOFF1`),
KEY `in_bbproduct_weekno` (`WEEKNO`),
KEY `in_bbproduct_routenoweekno` (`WEEKNO`,`ROUTENO`),
KEY `in_bbproduct_agencyroutedt` USING BTREE (`AGENCYNO3N`,`ROUTENO`,`DT`),
KEY `in_bbproduct_routenoagencyno3n` (`ROUTENO`,`AGENCYNO3N`),
KEY `in_bbproduct_agencyno` (`AGENCYNO3N`),
KEY `in_bbproduct_storeno_prodno` (`STORENO`,`PRODNO`),
KEY `ind_deptno_prodno` (`DEPTNO`,`PRODNO`),
KEY `ind_prodno` (`PRODNO`),
KEY `ind_dt_custno_deptno_prodno` (`DT`,`CUSTNO`,`DEPTNO`,`PRODNO`),
KEY `ind_dt_selloff1` (`DT`,`SELLOFF1`)
) ENGINE=MyISAM AUTO_INCREMENT=9300871 DEFAULT CHARSET=latin1
It takes 14 seconds, table has 9 millions of records, and query returns 15 rows. I will need to join this result set with some other records.
Can I do something more?
Since you are grouping by year and week number, I presume that most of the data will not change more than weekly. You can cache the result in another table that can be updated in batch only one time per week.
精彩评论