簡體   English   中英

如何提高此查詢的性能

[英]How to improve the performance of this query

我已經不願意嘗試創建索引,或者更改mysql配置以改善查詢,但我沒有理解。 有人可以幫我嗎?

我正在創建一個擁有超過四百萬種產品的系統,並且為了改善對用戶的響應時間,我正在創建一個物化視圖。

要創建此視圖,請使用以下查詢

INSERT into 
    consulta_atual 
SELECT 
    fc.cd_categoria, 
    tbc.cd_categoria as cd_categoria_site, 
    tbc.nm_categoria, 
    fc.ds_subcategoria, ppf.cd_produto_price,
    ppf2.cd_seq,
    f.tp_fornecedor as tp_fornecedor ,
    pp.nm_produto as name,
    pp.nm_slug as nm_slug,
    pf.cd_fornecedor as fornecedor,
    f.url_img_fornecedor as url_img_fornecedor,
    f.url_raiz_fornecedor as url_raiz_fornecedor,
    pf.url_imagem as url_imagem,
    concat(IFNULL(pf.url_produto_fornecedor_prefix,''),pf.url_produto_fornecedor,IFNULL(pf.url_produto_fornecedor_sufix,'')) as url_produto,
    CONCAT('R$ ', REPLACE(REPLACE(REPLACE(FORMAT(ppf.vlr_produto, 2),'.',';'),',','.'),';',',')) as vlr_produto,
    CONCAT(REPLACE(REPLACE(REPLACE(FORMAT(ppf.vlr_produto, 0),'.',';'),',','.'),';',','),' pontos') as pnt_produto,
    ppf.vlr_produto as vlr_produto_original,
    null,
    null,
    null 
FROM 
    produto_price pp,
    produto_fornecedor pf,
    preco_produto_fornecedor ppf,
    fornecedores f,
    fornecedores_categorias fc,
    vw_preco_atual ppf2,
    tb_st_category tbc 
WHERE 
        pp.cd_produto = pf.cd_produto_price 
    AND pf.cd_categoria = fc.cd_categoria 
    AND fc.cd_categoria_site = tbc.cd_categoria 
    AND pp.cd_produto = ppf2.cd_produto_price 
    AND pf.cd_fornecedor = f.cd_fornecedor 
    AND pf.cd_fornecedor = ppf2.cd_fornecedor 
    AND ppf2.cd_seq = ppf.cd_seq

但是,隨着時間的流逝和產品數量的增加,創建此表大約需要4個小時。 是否可以改善表或配置的移位性能指標?

腳本創建表

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;

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 a Categoria do 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 ;

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;

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 do 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 a 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命令非常昂貴。 盡量減少它們。 使用where條件索引字段

我看到您確實將結果集插入到另一個表中。 因此,已經插入的記錄不需要再次處理。 因此,最好的方法是使用時間戳為新創建的記錄運行此查詢。 如果沒有時間戳記,請重新引入。 一旦處理了一段時間的記錄,就將其存儲在某個地方。 並從該時間開始到當前時間。 通過這種批處理方式,您可以減少舊記錄的不必要時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM