MySQL服务器端游标详解

MySQL的服务器游标是通过C API中的mysql_stmt_attr_set() 实现的.同时服务器中存储过程的游标也采用相同的实现

MySQL服务器游标实现方式是通过临时表实现,首先将其放在Memory表中,如果数据大小超过max_heap_table_sizetmp_table_size ,就会变成MyISAM表,此时获取数据可能会变慢.

和客户端游标的区别

客户端游标是client先发送select请求给Server后,Server根据条件筛选符合条件的记录,然后就会把记录发送到自己的发送buffer,等buffer满了就flush缓存(这里要注意的是如果client的接受缓存满了,那么Server的发送就会阻塞主,直到client的接受缓存空闲。),通过网络发送到client的接受缓存,然后Client就会从接受缓存里面逐个读取记录到resultset,直到所有记录都放到了resultset。

服务器边的游标则是mysqlclient一次从自己的接受缓存读取fetchSize个记录(如果buffer不够fetchSize也没关系,因为Server一直在向这个buffer 刷新数据)。mysqlclient获取fetchSize个记录放到mysqlclient的游标内部的数组里面,游标获取的时候是从数组里面获取数据,如果数组为空了,在向buffer获取fetchSize个记录。

特点和限制

  • 游标是只读的,不支持UPDATE WHERE CURRENT OFDELETE WHERE CURRENT OF
  • 提交后游标就会关闭
  • 游标是敏感的,非滚动的
  • 游标没有名字,语句处理器表现为该游标的ID

参考资料

分享到