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的游标在处理大一点的数据量时还是比较乏力的,仅适合用于操作几百上千的小数据量。
分享到:
相关推荐
首先,我们来谈谈MySQL存储过程中的优化策略——使用临时表代替游标。游标在处理复杂查询和逐行操作时非常有用,但它们通常会带来性能问题,因为它们需要多次与数据库交互,每次交互都会增加系统的开销。相反,临时...
本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。
本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...
本文将探讨两个重要的优化策略:使用临时表代替游标以及巧建SUM索引来提升查询效率。 首先,我们来讨论“使用临时表代替游标”。在MySQL存储过程中,游标通常用于逐行处理结果集,但这种方式在处理大数据量时可能会...
在计算机等考三级数据库基础的学习中,临时表和游标是两个重要的概念,尤其是在处理数据操作和查询时。...在实际应用中,应根据需求选择合适类型的临时表和游标,并注意它们的生命周期管理,以优化数据库性能。
Mysql存储过程游标触发器
在MySQL中,游标通常与存储过程配合使用,使我们能够根据需要在结果集中向前或向后移动,实现逐行处理数据,这在动态或条件性的数据处理中尤为关键。 在“mysql存储过程_游标_项目练习”中,我们可能需要完成以下...
数据库编程技术——游标、存储过程与触发器 数据库编程技术是数据库管理系统中的一种重要技术,用于实现数据库的自动化管理和数据处理。本节实验重点介绍游标、存储过程和触发器三种数据库编程技术的应用。 一、...
根据提供的文件信息,本文将详细解释一个MySQL存储过程的例子,其中包含了游标的使用。这个存储过程主要用于处理一批数据,涉及到日期范围内的数据处理、异常处理等。下面将逐一解析存储过程中涉及的重要知识点。 #...
SQL中的触发器是一种特殊...总的来说,这个PPT学习教案涵盖了SQL中的关键概念,包括触发器、存储过程、临时表和游标,这些都是数据库管理和开发的重要组成部分,对于理解SQL的高级功能和实现复杂的业务逻辑至关重要。
在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活的数据处理逻辑。 #...
本示例展示了如何使用 CallabledStatement 来调用 Oracle 存储过程,并实现 IN OUT 参数和游标类型参数的使用。这种方法可以提高应用程序的性能和安全性。同时,游标类型参数的使用可以实现数据的批量处理,提高应用...
在MySQL中,存储过程是一种预编译的SQL语句集合,可以用于执行复杂的数据库操作,包括循环和游标的使用。游标允许我们逐行处理查询结果,这对于迭代数据进行处理非常有用。本示例中,我们将探讨如何在存储过程中循环...
标题:“oracle存储过程使用游标对多表操作例子”直接指出了文章的主题是关于在Oracle环境下,如何利用存储过程和游标实现跨多个表的数据处理。描述部分重复了标题内容,强调了示例性质,表明文章将通过具体实例来...
Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步分为隐式游标和显示游标。隐式...
本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...
我们定义了一个存储过程`chargemark`,该过程使用游标来遍历成绩表,并根据成绩的值来将其转换为等级制。 存储过程和游标的优点 使用存储过程和游标可以带来许多优点,例如: * 提高数据库的性能:存储过程可以预...
一个简单易理解的mysql存储过程 循环表操作 使用游标
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
在存储过程中填充临时表,然后通过游标(Cursor)将临时表的数据逐条取出,传递给调用者。 3. **并发控制**:由于每个会话都有独立的临时表空间,多个并发调用同一个存储过程时,它们之间的临时表数据不会相互干扰...