Оптимизировать запрос с помощью AVG () и группировать по большой таблице? - PullRequest
0 голосов
/ 12 октября 2010

Мне интересно, есть ли способ оптимизировать этот запрос:

SELECT Avg(selloff1), 
       YEAR(dt), 
       weekno 
FROM   bbproduct 
GROUP  BY YEAR(dt), 
          weekno 

Схема таблицы:

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

Это занимает 14 секунд, таблица содержит 9 миллионов записей, а запрос возвращает 15 строк. Мне нужно объединить этот набор результатов с некоторыми другими записями.

Могу ли я сделать что-то еще?

1 Ответ

2 голосов
/ 12 октября 2010

Поскольку вы группируете по номеру года и недели, я предполагаю, что большинство данных будут меняться не чаще, чем за неделю. Вы можете кэшировать результат в другой таблице, которую можно обновлять в пакетном режиме только один раз в неделю.

...