tags:

views:

28

answers:

1

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) unsigned 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?

+2  A: 

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.

Luca Martini
+1 - Or use an indexed/materialized view if mySQL supports them.
Winston Smith