MySQL表操作过程的基础代码解析
- GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
MySQL 的表有很多种,对表的操作主要是增删改查,今天来浅谈一下这些操作的底层代码和流程,以下以 tmp table为例子,为了更好的说明操作流程,该表没有建立 primary key。
1.首先创建一张 tmp table,第三个参数 is_virtual=false 代表这不是虚拟表,如果这个值设置为true那说明这是虚拟表,主要给存储过程建立临时表来存储参数的,这种虚拟表没有handler,只能存储列信息和单行列值,不能存放多行值,不能进行增删操作。
Table *table = create_tmp_table_from_fields(thd, *get_field_list(), false, options, table_alias);
创建表过程中会做以下操作:
1、初始化表:table->init_tmp_table
2、用传进来的create_field 信息创建表的列:make_field
3、创建表增删改查用的操作句柄:setup_tmp_table_handler
2、查找操作
table->file->ha_rnd_init(true) handler 初始化
int rec = table->file->ha_rnd_next(table->record[0]) 从第一行开始查找,一次指针向下跳一行,table->record[0]用于存储查到的值
对结果的判断:
switch (rec) {
case 0: {
查找成功可以取出查到的值,此时该行值在table->field[col],col代表第几列
break;
}
case HA_ERR_END_OF_FILE:
if (table->file->ha_rnd_end()) return true; 查找到最后一行退出
break;
default:
查找出错处理
3、插入一行,这个操作相对简单只有两步
for (ulonglong u = 0; u < upper_bound; ++u)
if (table->field[i]->store(u, true)) return true; 首先循环把值u存入第i列的record[0]
if (write_row()) return true;直接把值从record[0]写入表即可
3、更新一行
if (table->file->ha_rnd_init(true)) return true; 初始化handler
for (int i = 0; i < offset_table + 1; i++) {
if (table->file->ha_rnd_next(table->record[1])) return true; 让指针跳到指定要更新的那一行,注意这里该行的值存在record[1]
}
memcpy(table->record[0], table->record[1], (size_t)table->s->reclength);把值从record[1]拷贝到record[0]
(*value)->save_in_field(get_field(i), false); 把value值存入第i列的record[0],注意此时别的列值还是表里查到的值,这样record[0]就是新的值
if (table->file->ha_update_row(table->record[1], table->record[0])) 更新数据,这里record[1]是旧的值即表里的值,record[0]是新的值即待更新的值
return true;
if (table->file->ha_rnd_end()) return true; 结束本次handler
4、删除一行
table->file->ha_rnd_init(true) handler初始化
for (int i = 0; i < offset_table + 1; i++) {
if (table->file->ha_rnd_next(table->record[0])) return true; 让指针跳到指定要删除的那一行
}
ret = table->file->ha_delete_row(table->record[0]); 删除当前行
if (table->file->ha_rnd_end()) return true; 结束本次handler
5、关闭表
close_tmp_table(table); 关闭临时表
free_tmp_table(table); 释放表资源
6、打开表
open_tmp_table(TABLE *table)这个打开表
以上是没有主键和索引的临时表操作,如果是有主键的表就涉及到索引的查询操作,这期不涉及这个知识点,下期再谈。
Enjoy GreatSQL
文章推荐:
面向金融级应用的GreatSQL正式开源
https://mp.weixin.qq.com/s/cI_wPKQJuXItVWpOx_yNTg
Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qcn0lmsMoLtaGO9hbpnhVg
MGR及GreatSQL资源汇总
https://mp.weixin.qq.com/s/qXMct_pOVN5FGoLsXSD0MA
GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA
在Linux下源码编译安装GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZZOWKqSaGSy-mpD2GdNcA
关于 GreatSQL
GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
Bilibili:
https://space.bilibili.com/1363850082/video
微信&QQ群:
可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 发布!
MySQL表操作过程的基础代码解析的更多相关文章
- Mysql基础代码(不断完善中)
Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...
- MYSQL常见出错mysql_errno()代码解析
如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...
- [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM
一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...
- [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写
一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...
- [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC
一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...
- [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...
- 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析
一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...
- 【原创】大数据基础之Spark(4)RDD原理及代码解析
一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-di ...
- MySQL优化的一些基础
在Apache, PHP, mysql的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接 影响到论坛的速度和承载量! ...
随机推荐
- 好客租房15-jsx中的条件渲染
jsx中的条件渲染 场景:loding效果 条件渲染:根据条件渲染特定的jsx结构 可以使用if/else或者三元运算符和逻辑和运算符实现 //导入react import React from &q ...
- python之部分内置函数与迭代器与异常处理
目录 常见内置函数(部分) 可迭代对象 迭代器对象 for循环内部原理 异常处理 异常信息的组成部分 异常的分类 异常处理实操 异常处理的其他操作 for循环本质 迭代取值与索引取值的区别 常见内置函 ...
- cut-列过滤
列过滤命令. 语法 cut [选项] 要过滤的字符串 选项 -f 以字段为单位进行分割 -c 以字符为单位进行分割 -b 以字节为单位进行分割 -d 以分割符为单位进行分割,分隔符可以是"冒 ...
- TypeError: this.getOptions is not a function
我在vue ui界面中安装版本依赖包后报这个错误 less-loader/sass-loader安装的版本过高 解决办法 删除原有的版本依赖包,安装更低版本的依赖包. 如 @6.0.1为选择安装的版本 ...
- systemctl设置程序开机启动、关闭、启用/禁用服务以vsftpd为例
参考:https://blog.csdn.net/qq_29663071/article/details/80814081 systemctl是RHEL 7 的服务管理工具中主要的工具,它融合之前se ...
- 漏洞修复之Oracle系列
Oracle 11g CVE-2012-1675(远程投毒)漏洞修复. 数据库版本 Oracle 11g 11.2.0.4.0非RAC 漏洞编号 CVE-2012-1675 漏洞介绍 Oracle允许 ...
- 想学设计模式、想搞架构设计,先学学UML系统建模吧您
UML系统建模 1 概述 1.1 课程概述 汇集UML及其相关的一些话题 回顾UML相关的符号与概念 以电商订单相关业务为例,借助UML完成系统建模 将UML变成提升建模效率,表达架构思想的工具 1. ...
- Node.js amqplib 连接 Rabbitmq 学习笔记
var amqp = require('amqplib'); connect([url, [socketOptions]]) var amqp = require('amqplib/callback_ ...
- java编程用大小写字母及数字输出五位数验证码
package day08; import java.util.Random;//导入util下的Random包 public class Yanzhengma { public static voi ...
- SAP 实例 13 Random Grouping with LOOP
REPORT demo_loop_group_by_random. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS: main, class_ ...