mysql - How to improve the performance of this query -
i have broken head try create indices, or change mysql configuration improve query i'm not getting it. me?
i creating system has more 4 million products , improve response time user, creating materialized view.
to create view use query below
insert consulta_atual select fc.cd_categoria, tbc.cd_categoria cd_categoria_site, tbc.nm_categoria, fc.ds_subcategoria, ppf.cd_produto_price, ppf2.cd_seq, f.tp_fornecedor tp_fornecedor , pp.nm_produto name, pp.nm_slug nm_slug, pf.cd_fornecedor fornecedor, f.url_img_fornecedor url_img_fornecedor, f.url_raiz_fornecedor url_raiz_fornecedor, pf.url_imagem url_imagem, concat(ifnull(pf.url_produto_fornecedor_prefix,''),pf.url_produto_fornecedor,ifnull(pf.url_produto_fornecedor_sufix,'')) url_produto, concat('r$ ', replace(replace(replace(format(ppf.vlr_produto, 2),'.',';'),',','.'),';',',')) vlr_produto, concat(replace(replace(replace(format(ppf.vlr_produto, 0),'.',';'),',','.'),';',','),' pontos') pnt_produto, ppf.vlr_produto vlr_produto_original, null, null, null produto_price pp, produto_fornecedor pf, preco_produto_fornecedor ppf, fornecedores f, fornecedores_categorias fc, vw_preco_atual ppf2, tb_st_category tbc pp.cd_produto = pf.cd_produto_price , pf.cd_categoria = fc.cd_categoria , fc.cd_categoria_site = tbc.cd_categoria , pp.cd_produto = ppf2.cd_produto_price , pf.cd_fornecedor = f.cd_fornecedor , pf.cd_fornecedor = ppf2.cd_fornecedor , ppf2.cd_seq = ppf.cd_seq
however, passage of time, , increasing product taking 4 hours table being created. possible improve shifting performance indices of tables or configuration?
script create tables
create table if not exists `consulta_atual` ( `cd_categoria` int(11) not null default '0', `cd_categoria_site` int(11) default null, `ds_categoria` varchar(100) not null, `ds_subcategoria` varchar(200) not null, `cd_produto_price` bigint(11) not null, `cd_seq` bigint(20) not null default '0', `tp_fornecedor` int(11) not null default '0', `name` varchar(300) not null, `nm_slug` varchar(200) default null, `fornecedor` int(11) not null, `url_img_fornecedor` varchar(200) not null, `url_raiz_fornecedor` varchar(200) not null, `url_imagem` varchar(500) not null, `url_produto` varchar(500) not null, `vlr_produto` varchar(49) not null default '', `pnt_produto` varchar(53) not null default '', `vlr_produto_original` float(10,2) not null, `menor_valor` float default null, `maior_valor` float default null, `qtd_lojas` int(11) default null, primary key (`cd_produto_price`,`fornecedor`), key `nm_slug_2` (`nm_slug`), key `ds_categoria` (`ds_categoria`), key `vlr_produto_original` (`vlr_produto_original`), key `cd_categoria_site` (`cd_categoria_site`), key `fornecedor` (`fornecedor`), key `tp_fornecedor` (`tp_fornecedor`), fulltext key `name` (`name`), fulltext key `ds_categoria_2` (`ds_categoria`), fulltext key `ds_categoria_3` (`ds_categoria`,`name`) ) engine=myisam default charset=utf8;
and
create table if not exists `fornecedores` ( `cd_fornecedor` int(11) not null auto_increment, `nm_fornecedor` varchar(50) not null, `tp_fornecedor` int(11) not null default '0', `url_img_fornecedor` varchar(200) not null, `dt_atualizacao` timestamp not null default '0000-00-00 00:00:00' on update current_timestamp, `url_raiz_fornecedor` varchar(200) not null, primary key (`cd_fornecedor`) ) engine=myisam default charset=utf8 auto_increment=16 ; create table if not exists `fornecedores_categorias` ( `cd_categoria` int(11) not null auto_increment, `cd_fornecedor` int(11) not null, `cd_categoria_site` int(11) default null comment 'referencia categoria site', `ds_categoria` varchar(100) not null, `url_categoria` varchar(200) not null, `cd_prioridade` int(11) not null default '1', `ds_subcategoria` varchar(200) not null, primary key (`url_categoria`), unique key `cd_categoria` (`cd_categoria`), key `ds_categoria` (`ds_categoria`), key `cd_categoria_site` (`cd_categoria_site`) ) engine=myisam default charset=utf8 auto_increment=6112 ;
and
create table if not exists `preco_produto_fornecedor` ( `cd_seq` bigint(20) not null auto_increment, `cd_produto_price` bigint(11) not null, `cd_fornecedor` int(11) not null, `dt_atualizacao` timestamp not null default current_timestamp, `vlr_produto` float(10,2) not null, `flg_sucesso` tinyint(1) not null, primary key (`cd_seq`,`cd_produto_price`,`cd_fornecedor`), key `dt_atualizacao` (`dt_atualizacao`), key `cd_fornecedor` (`cd_fornecedor`), key `vlr_produto` (`vlr_produto`), key `cd_produto_price` (`cd_produto_price`) ) engine=innodb default charset=utf8 auto_increment=151452428 ; create table if not exists `produto_fornecedor` ( `cd_produto_price` bigint(11) not null, `ds_produto` varchar(5000) default null, `cd_categoria` int(11) not null, `url_produto_fornecedor` varchar(500) not null, `url_produto_fornecedor_prefix` varchar(200) default null comment 'url afiliados antes', `url_produto_fornecedor_sufix` varchar(200) default null comment 'url afiliados depois', `url_imagem` varchar(500) not null, `cd_fornecedor` int(11) not null, `flg_ativo` tinyint(1) not null, `dt_atualizacao` timestamp not null default '0000-00-00 00:00:00' on update current_timestamp, primary key (`cd_produto_price`,`cd_fornecedor`), key `ds_produto_2` (`ds_produto`(333)) ) engine=myisam default charset=utf8;
and
create table if not exists `produto_price` ( `cd_produto` bigint(11) not null auto_increment, `nm_produto` varchar(300) not null, `nm_slug` varchar(200) default null, `cd_categoria` int(11) not null, primary key (`cd_produto`), unique key `nm_produto_2` (`nm_produto`), unique key `nm_slug_2` (`nm_slug`), fulltext key `nm_produto` (`nm_produto`) ) engine=myisam default charset=utf8 auto_increment=3861158 ; create table if not exists `tb_st_category` ( `cd_categoria` int(11) not null auto_increment, `nm_categoria` varchar(100) not null, `ds_categoria` varchar(500) default null, `url_img_categoria` varchar(100) default null, `nm_slug` varchar(100) default null comment 'nome amigavel da categoria para poder indexar no google', `flg_menu_topo` tinyint(1) not null default '1' comment 'flag para aparecer ou nao no menu site', `flg_categoria_especial` tinyint(1) not null default '0' comment 'flag para aparecer com prioridade (ex.: categoria de natal)', `cd_categoria_pai` int(11) not null default '0' comment 'se tiver com numero maior que 0 é uma subcategoria', `flg_ativo` tinyint(1) not null default '0' comment '0 desativado 1 ativo', `dt_cadastro` timestamp not null default current_timestamp comment 'data que foi criado categoria', primary key (`cd_categoria`), fulltext key `ds_categoria` (`ds_categoria`) ) engine=myisam default charset=utf8 auto_increment=437 ; create table if not exists `vw_preco_atual` ( `cd_produto_price` bigint(11) not null, `cd_fornecedor` int(11) not null, `cd_seq` bigint(20) not null default '0', primary key (`cd_fornecedor`,`cd_produto_price`), unique key `cd_seq` (`cd_seq`) ) engine=myisam default charset=utf8;
replace commands in query expensive. try reduce them as possible. index fields used condition
i see insert resultset in table. records inserted, not need processed again. best way run query newly created records using timestamp. if don't have timestamps, introduce them newly. once process records upto time, store somewhere. , start time current time. in way of batching, reduce unnecessary time old records..
Comments
Post a Comment