共计 2502 个字符,预计需要花费 7 分钟才能阅读完成。
- 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…
Changes in GreatSQL 8.0.25 (2021-8-18)
https://mp.weixin.qq.com/s/qc…
MGR 及 GreatSQL 资源汇总
https://mp.weixin.qq.com/s/qX…
GreatSQL MGR FAQ
https://mp.weixin.qq.com/s/J6…
在 Linux 下源码编译装置 GreatSQL/MySQL
https://mp.weixin.qq.com/s/WZ…
# 对于 GreatSQL
GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。
Gitee:
https://gitee.com/GreatSQL/Gr…
GitHub:
https://github.com/GreatSQL/G…
Bilibili:
https://space.bilibili.com/13…
微信 &QQ 群:
可搜寻增加 GreatSQL 社区助手微信好友,发送验证信息“加群”退出 GreatSQL/MGR 交换微信群
QQ 群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 公布!