关于mysql:MySQL表操作过程的基础代码解析

55次阅读

共计 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 公布!

正文完
 0