MySQL高级篇-游标【Cursor】

记得有一次,我在做一个数据库项目,面对大量需要处理的数据,我感到非常焦虑。
项目要求我们统计某门课程前五名学生的总成绩。
此任务无法使用普通的 SELECT 语句完成。
我们必须手动计算每个学生的分数,然后将它们相加。
我想起了MySQL中的光标。
这个东西可以对结果集进行一一处理,就派上用场了。

我首先声明了一个游标,然后编写了一条SELECT语句来选择前五名学生。
打开游标,准备开始一一读取数据。
起初我还挺兴奋的,以为这次可以轻松完成这个任务了。
没想到,随着资料一一读取,我的耐心一点一点被磨灭。
这个过程太慢了,我什至可以数出数据库每次响应的时间。

看完所有的数据,我计算了总分,但总觉得有些不对劲。
等等,我突然想到,如果这门课的学生太多,每次打开游标、读取数据、关闭游标的过程会消耗更多的资源。
我查了一下,发现确实是这样。
游标操作虽然方便,但是性能开销也不小。
因此,在完成此任务的同时,我也意识到使用光标的一些潜在问题。

MySQL中的流式查询及游标查询方式(总结分享)

说白了,MySQL中的流式查询和游标查询都是处理大数据量查询的高效方法。
然而,它们各有各的优点。
其实很简单。
流查询可以通过向数据库指定特定参数来逐行返回数据。
虽然内存占用很低,但是速度提升并不明显。
游标查询不仅可以减少内存消耗,还可以在将数据加载到集群时提高查询速度。

首先,流式查询最重要的优点是占用内存很少。
我们去年做的一个项目处理了 5 00 万行数据,只使用了 7 0MB 堆内存,完全没有 OOM。
然而,它的弱点也很明显。
查询速度与普通查询相当,效率没有明显提升。
另外,查询期间的连接是私有的,不能执行其他操作。

还有一点,游标查询的优点是平衡了内存和速度。
它还处理 5 00 万行数据。
其内存占用与流式查询相当,但查询速度可提高3 0%左右。
例如,对于5 0,000行数据;时间从1 3 5 秒缩短至9 0秒。
但是,游标查询的缺点也不容忽视。
这是 IOPS 和磁盘空间它需要服务器建立临时空间来存储未消费的数据,这增加了客户端需要等待服务器准备数据,增加了网络响应延迟。

最初我认为流式查询是所有情况下的最佳选择,但后来我意识到这是错误的。
尤其是在处理大量数据且速度要求不高的情况下。
直接查询是一个不错的选择。
稍等一下,还有一件事直接查询和游标查询在底层机制上有所不同。
直接查询使用 RowDataDynamic 通过 RowDataCursor 顺序读取;而游标则通过RowDataCursor集群查询缓存。

简而言之,流式查询适合对内存敏感但速度较低的场景。
虽然游标查询在可控内存方案下可以显着提高查询效率。
特别适合批量处理大量数据。
我认为值得尝试一下,看看哪种方法更适合您的特定需求。

mysql中cursor怎么使用

嘿,我们来谈谈MySQL中的指针。
说实话,这个东西在处理大数据集或者需要逐行操作的情况时非常有用。
我在做大数据分析的时候经常用到它。

首先必须声明一个指针,使用DECLARE关键字,然后指定要查询的SQL语句。
这通常在变量声明之后在存储过程或函数中完成。
例如:
sql DECLARE cur CURSOR TO SELECT COLUMN1 , COLUMN2 FROM table_name WHERE 条件;
然后打开游标,将查询结果压入游标中。
此操作称为 OPEN 指针。
规模 打开当前;
接下来,使用 FETCH 关键字逐行读取数据。
通常,这与 for 循环相结合来处理所有行。
像这样:
sql 获取@var1 、@var2 ;
最后,不要忘记关闭游标以释放资源,避免内存泄漏。
使用CLOSE关键字:
sql 关闭线程;
例如,在之前的一个项目中,我要更新员工表中某个部门的工资。
我们这样写:
sql 分隔符 // 创建过程 update_salary() 开始 使用 INT 默认值声明 false; 声明 emp_id INT; 声明 emp_salary DECIMAL(1 0,2 ); Cur CURSOR INTO id, 工资来自员工 WHERE 部门 = 'IT'; 未找到 set = true;
open cur;
read_loop: LOOP 从 emp_id、emp_sary 获取; 如果有效的话 退出read_loop; IF END,
更新员工工资 = emp_sary 1 .1 WHERE id = emp_id; end LOOP;
关闭cur; 结束 // 分隔符;
关于指针的优缺点,优点是逐行处理,节省内存,一次加载大数据集;动态操作,支持更新或删除结果集;分页/滚动,可以通过MOVE或循环实现复杂的分页逻辑。
但也有缺点,比如除了性能之外,索引占用服务器资源,重复操作会影响性能。
代码复杂,需要手动开启/关闭管理,且容易出错。

实际情况包括处理无法立即加载到内存中的大型结果集。
需要根据每行数据动态更新或删除的行级操作;需要精确控制输出组行程顺序的复合体页。
一般来说,使用逻辑指针可以更高效地处理复杂的数据操作,但在性能和代码复杂度之间需要权衡。
对此,我个人认为,如果情况不复杂,使用JOIN、临时表或ApplicationPage代替索引可能会更容易。