mysql 借用临时加索引的方式,使原来几分钟以上才能查出来的数据,优化到2秒钟以内

博客介绍了在MySQL中借用临时加索引的方式优化数据查询速度。原本需要几分钟以上才能查询出的数据,通过该方法可优化到2秒钟以内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

借用临时加索引的方式,使原来几分钟以上才能查出来的数据,优化到2秒钟以内

CREATE DEFINER=`root`@`%` PROCEDURE `sp_tbpm_lyh`(IN year1 INT,IN year2 INT,IN bmonthe INT,IN emonthe INT,IN endnum INT)
BEGIN
	
	DROP TABLE IF	EXISTS tmp_table3;
	DROP TABLE IF EXISTS tmp_table4;
	
	CREATE TEMPORARY TABLE `tmp_table3`  (
  `taxpayer_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
  `taxpayer_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',  
  `collection_items` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
  `industry_category` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
  `bid_industry` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
	`middle_industry` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
	`town` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
	`industry` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',
	`tax_duration_end` date NULL DEFAULT NULL COMMENT '',
	`amount_paid_in` double(10, 2) NULL DEFAULT NULL ,
	`swbnlj` double(10, 2) NULL DEFAULT NULL COMMENT '',
  `register_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',  
  INDEX `taxpayer_name_citems`(`taxpayer_name`, `collection_items`) USING BTREE,
  INDEX `tax_duration_end`(`tax_duration_end`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '' ROW_FORMAT = Compact;

		CREATE TEMPORARY TABLE `tmp_table4`  ( 
  `taxpayer_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',  
  `collection_items` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '',  
	`swsnlj` double(10, 2) NULL DEFAULT NULL ,  
  INDEX `taxpayer_name_citems`(`taxpayer_name`, `collection_items`) USING BTREE  
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;


	insert into tmp_table3(taxpayer_name,
				industry_category,
				bid_industry,
				middle_industry,
				industry,
				tax_duration_end,
				amount_paid_in,
				swbnlj,
				collection_items,
				town,
				taxpayer_code,
				register_type )  SELECT
				sw.taxpayer_name,
				sw.industry_category,
				sw.bid_industry,
				sw.middle_industry,
				sw.industry,
				sw.tax_duration_end,
				sw.amount_paid_in,
				IFNULL( sum( sw.amount_paid_in ), 0.0 ) AS 'swbnlj',
				sw.collection_items,
				sw.town,
				sw.taxpayer_code,
				sw.register_type 
			FROM
				sw_net_storage_info sw 
			WHERE
				1 = 1 
				AND YEAR ( sw.tax_duration_end ) =year1 
			GROUP BY
				sw.taxpayer_name,
				sw.collection_items ;
		
	insert into tmp_table4(taxpayer_name,swsnlj,collection_items)  SELECT
				sw.taxpayer_name,
				IFNULL( sum( sw.amount_paid_in ), 0.0 ) AS 'swsnlj',
				sw.collection_items 
			FROM
				sw_net_storage_info sw 
			WHERE
				1 = 1 
				AND YEAR ( sw.tax_duration_end ) =year2- 1 
			GROUP BY
				sw.taxpayer_name,
				sw.collection_items; 
		
	SELECT
	b.* 
FROM
	(
SELECT
	t.*,
CASE
	
	WHEN @rowtotal = t.tbzj THEN
	@rownum 
	WHEN @rowtotal := t.tbzj THEN
	@rownum := @rownum + 1 
	WHEN @rowtotal = 0 THEN
	@rownum := @rownum + 1 
	END AS rownum 
FROM
	( SELECT @rownum := 0, @rowtotal := NULL ) r,
	(
	SELECT
		swtb.taxpayer_name,
		swtb.swbnlj,
		swtb.tbzj,
		swtb.swsnlj,
		sum( CASE WHEN dl.YEAR =year1 AND dl.MONTH BETWEEN bmonthe AND emonthe THEN dl.kWh ELSE 0.0 END ) AS 'bnkwh',
		sum( CASE WHEN dl.YEAR =year2- 1 AND dl.MONTH BETWEEN bmonthe AND emonthe THEN dl.kWh ELSE 0.0 END ) AS 'snkwh' 
	FROM
		(
		SELECT
			swbn.taxpayer_name,
			swbn.industry_category,
			swbn.bid_industry,
			swbn.middle_industry,
			swbn.industry,
			swbn.tax_duration_end,
			IFNULL( sum( swbn.swbnlj ), 0.0 ) AS swbnlj,
			IFNULL( sum( swbn.swbnlj ), 0.0 ) - IFNULL( sum( swsn.swsnlj ), 0.0 ) AS tbzj,
			swbn.collection_items,
			swbn.town,
			swbn.taxpayer_code,
			swbn.register_type,
			IFNULL( sum( swsn.swsnlj ), 0.0 ) AS swsnlj 
		FROM
			tmp_table3 AS swbn
			LEFT OUTER JOIN tmp_table4 AS swsn ON swbn.taxpayer_name = swsn.taxpayer_name 
			AND swbn.collection_items = swsn.collection_items 
		WHERE
			1 = 1 
			AND MONTH ( swbn.tax_duration_end ) >=bmonthe 
			AND MONTH ( swbn.tax_duration_end ) <=emonthe 
		GROUP BY
			swbn.taxpayer_name 
		) AS swtb
		LEFT OUTER JOIN dl_use_info dl ON swtb.taxpayer_name = dl.register_name 
	WHERE
		swtb.tbzj >= 0 
	GROUP BY
		swtb.taxpayer_name 
	ORDER BY
		swtb.tbzj DESC 
	) AS t 
	) AS b 
WHERE
	1 = 1 
	AND b.rownum <=endnum; 
END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值