`

Mysql存储过程优化——使用临时表代替游标

阅读更多

Mysql游标在操作小数据量时比较方便,效率可观,但操作大数据量,速度比较慢,甚至直接产生系统错误。

 

一般说来,当操作的数据超过1万条时,就避免用游标吧。

 

为了测试游标性能,写了下面一个游标对IDC_Gather_Info表中数据进行遍历

CREATE DEFINER=`root`@`%` PROCEDURE `debug`(IN `beginTime` int, IN `checkTime` int)
BEGIN
	DECLARE t_id VARCHAR(64) DEFAULT '';
	DECLARE t_item TINYINT DEFAULT 0;
	DECLARE t_result VARCHAR(8192) DEFAULT '';

	DECLARE cursorDone INT DEFAULT 0;
	DECLARE cur CURSOR FOR SELECT Asset_Id, Check_Item, Check_Result from IDC_Gather_Info WHERE Check_Time > beginTime AND Check_Time <= checkTime;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET cursorDone = 1;

	OPEN cur;
	cursorLoop:LOOP
		FETCH cur INTO t_id, t_item, t_result;
		IF cursorDone = 1 THEN
			LEAVE cursorLoop;
		END IF;
	END LOOP;
	CLOSE cur;
END

下面是当表中数据分别为15万、5万、1万时游标的表现:

 

1.数据量15万,存储过程执行失败,提示错误:Incorrect key file for table '/tmp/#sql_3044_0.MYI';try to repair it

2.数据量5万,执行成功,耗时31.051s

3.数据量1万,执行成功,耗时1.371s

 

下面使用临时表替换游标:

CREATE DEFINER=`root`@`%` PROCEDURE `debug`(IN `beginTime` int, IN `checkTime` int)
BEGIN
	DECLARE t_id VARCHAR(64) DEFAULT '';
	DECLARE t_item TINYINT DEFAULT 0;
	DECLARE t_result VARCHAR(8192) DEFAULT '';
	
	DECLARE maxCnt INT DEFAULT 0;
	DECLARE i INT DEFAULT 0;

	DROP TABLE IF EXISTS Gather_Data_Tmp;
	CREATE TEMPORARY TABLE Gather_Data_Tmp(
		`Tmp_Id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
		`Asset_Id` VARCHAR(16) NOT NULL,
		`Check_Item` TINYINT(1) NOT NULL,
		`Check_Result` VARCHAR(8192) NOT NULL,
		PRIMARY KEY (`Tmp_Id`)
	)ENGINE=MyISAM DEFAULT CHARSET=utf8;

	SET @tSql = CONCAT('INSERT INTO Gather_Data_Tmp (`Asset_Id`, `Check_Item`, `Check_Result`) 
											SELECT Asset_Id, Check_Item, Check_Result 
											FROM IDC_Gather_Info 
											WHERE Check_Time > ',beginTime,' AND Check_Time <= ',checkTime);
	PREPARE gatherData FROM @tSql;
	EXECUTE gatherData;

	SELECT MIN(`Tmp_Id`) INTO i FROM Gather_Data_Tmp;
	SELECT MAX(`Tmp_Id`) INTO maxCnt FROM Gather_Data_Tmp;

	WHILE i <= maxCnt DO
		SELECT Asset_Id, Check_Item, Check_Result INTO t_id, t_item, t_result FROM Gather_Data_Tmp WHERE Tmp_Id = i;
		SET i = i + 1;
	END WHILE;
END
 

1.数据量15万,执行成功,耗时8.928s

2.数据量5万,执行成功,耗时2.994s

3.数据量1万,执行成功,耗时0.634s

 

可以看到Mysql的游标在处理大一点的数据量时还是比较乏力的,仅适合用于操作几百上千的小数据量。

2
8
分享到:
评论

相关推荐

    mysql优化——部分

    首先,我们来谈谈MySQL存储过程中的优化策略——使用临时表代替游标。游标在处理复杂查询和逐行操作时非常有用,但它们通常会带来性能问题,因为它们需要多次与数据库交互,每次交互都会增加系统的开销。相反,临时...

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    mysql存储过程优化

    本文将探讨两个重要的优化策略:使用临时表代替游标以及巧建SUM索引来提升查询效率。 首先,我们来讨论“使用临时表代替游标”。在MySQL存储过程中,游标通常用于逐行处理结果集,但这种方式在处理大数据量时可能会...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    计算机等考三级数据库基础:临时表和游标的使用小总结.docx

    在计算机等考三级数据库基础的学习中,临时表和游标是两个重要的概念,尤其是在处理数据操作和查询时。...在实际应用中,应根据需求选择合适类型的临时表和游标,并注意它们的生命周期管理,以优化数据库性能。

    Mysql存储过程游标触发器

    Mysql存储过程游标触发器

    mysql存储过程_游标_项目练习

    在MySQL中,游标通常与存储过程配合使用,使我们能够根据需要在结果集中向前或向后移动,实现逐行处理数据,这在动态或条件性的数据处理中尤为关键。 在“mysql存储过程_游标_项目练习”中,我们可能需要完成以下...

    实验八数据库编程技术——游标、存储过程与触发器.pdf

    数据库编程技术——游标、存储过程与触发器 数据库编程技术是数据库管理系统中的一种重要技术,用于实现数据库的自动化管理和数据处理。本节实验重点介绍游标、存储过程和触发器三种数据库编程技术的应用。 一、...

    mysql游标存储过程例子

    根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...

    SQL补充触发器临时表与游标PPT学习教案.pptx

    SQL中的触发器是一种特殊...总的来说,这个PPT学习教案涵盖了SQL中的关键概念,包括触发器、存储过程、临时表和游标,这些都是数据库管理和开发的重要组成部分,对于理解SQL的高级功能和实现复杂的业务逻辑至关重要。

    Mysql游标(循环操作)

    在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    本示例展示了如何使用 CallabledStatement 来调用 Oracle 存储过程,并实现 IN OUT 参数和游标类型参数的使用。这种方法可以提高应用程序的性能和安全性。同时,游标类型参数的使用可以实现数据的批量处理,提高应用...

    Mysql存储过程循环内嵌套使用游标示例代码

    在MySQL中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,包括循环和游标的使用。游标允许我们逐行处理查询结果,这对于迭代数据进行处理非常有用。本示例中,我们将探讨如何在存储过程中循环...

    Oracle存储过程游标详解

    Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步分为隐式游标和显示游标。隐式...

    oracle存储过程使用游标对多表操作例子

    标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,如何利用存储过程和游标实现跨多个表的数据处理。描述部分重复了标题内容,强调了示例性质,表明文章将通过具体实例来...

    mysql经典教程+mysql存储过程讲解

    本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...

    sql存储过程和游标的运用

    我们定义了一个存储过程`chargemark`,该过程使用游标来遍历成绩表,并根据成绩的值来将其转换为等级制。 存储过程和游标的优点 使用存储过程和游标可以带来许多优点,例如: * 提高数据库的性能:存储过程可以预...

    mysql存储过程循环表

    一个简单易理解的mysql存储过程 循环表操作 使用游标

    Oracel储存过程用临时表

    在存储过程中填充临时表,然后通过游标(Cursor)将临时表的数据逐条取出,传递给调用者。 3. **并发控制**:由于每个会话都有独立的临时表空间,多个并发调用同一个存储过程时,它们之间的临时表数据不会相互干扰...

    ACCP5.0高级数据库功能触发器,临时表和游标

    深入详解触发器的工作原理和案例,深入讲解本地临时表和全局临时表的区别,讲解游标的使用

Global site tag (gtag.js) - Google Analytics