• 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表操作过程的基础代码解析的更多相关文章

  1. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  2. MYSQL常见出错mysql_errno()代码解析

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

  3. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  4. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  5. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

  6. [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...

  7. 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析

    一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...

  8. 【原创】大数据基础之Spark(4)RDD原理及代码解析

    一 简介 spark核心是RDD,官方文档地址:https://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-di ...

  9. MySQL优化的一些基础

    在Apache, PHP, mysql的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接 影响到论坛的速度和承载量! ...

随机推荐

  1. 122_Power Pivot&Power BI不连续日期的日环比

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 这两天有朋友在交流,dax中使用时间智能函数写日环比,一个 dateadd 就可以了.但是有些业务不是每天都连续 ...

  2. 今天才发现ThinkPad的触摸板简直好用!傻乎乎的自己

    最近经常看到这句话,天下武功,唯快不破. 今天才发现ThinkPad的触摸板简直好用! 今天才发现,傻乎乎的自己. 前一阵鼠标不好用了,没有滚轮,一直傻瓜式操作点击浏览器的滚动条... 遇到没有滚动条 ...

  3. DOM标签操作与事件与jQuery查找标签

    目录 DOM之操作标签 创建标签对象 标签对象的属性 innerText与innerHTML 标签内部追加内容 属性操作 事件 常用事件 事件绑定 事件案例 jQuery简介 查找标签 基本选择器 属 ...

  4. yolov1学习笔记

    yolov1学习笔记 yolov1将目标检测归为一个回归问题,具有real-time的特点.局限性是:对于群体性的小目标检测效果很差. 论文概括 本文重新构造目标检测作为一个回归问题. 直接输入图像到 ...

  5. 初识 Redis 以及其基本使用方法

     1.什么是Redis  redis 是一个高性能的key-value数据库,它支持的类型更多 包括 string(字符串).list(链表).set(集合).zset(sorted set --有序 ...

  6. 牛客多校赛2K Keyboard Free

    Description 给定 \(3\) 个同心圆,半径分别为 \(r1,r2,r3\) ,三个点分别随机分布在三个圆上,求这个三角形期望下的面积. Solution 首先可以固定 \(A\) 点,枚 ...

  7. Centos7 中安装Elasticsearch

    1.下载安装包 1.1 下载elasticsearch 7.13.3 curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/e ...

  8. shell 问题记录

    工作中写了个 RestAPI 接口,然后想通过 crontab 任务,去定时调用接口.发现去拼接 post 请求真的不容易.对于单引号,双引号的使用.很懵,示例代码如下:对于 '$line' 处,单引 ...

  9. 【RPA之家BluePrism手把手教程】2.3 多重计算

    2.3.1 添加除法运算计算框 2.3.2 设置除法运算计算属性 2.3.3 程序运行前初始值 2.3.4 程序运行后结果 使用多重计算框实现以上操作 2.3.5 添加多重选择框 2.3.6 设置多重 ...

  10. BigDecimal加减乘除及setScale的用法小结

    Bigdecimal初始化: BigDecimal num = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失. BigDecimal num = new Big ...