暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库内核miniToadb】第101节 UPDATE原地更新VS多版本更新,N2OVSO2N 多种存储机制内核实现

开源无限 2025-06-17
30

💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!

🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!

公众号:开源无限

一、概述 


前面介绍了创建和删除数据表,向数据表中插入和查询数据行,对于数据行的操作,还有一个非常重要的操作——它就是数据行的更新,也就是UPDATE命令。数据行的更新操作,同样也包括了语法解析,执行计划,执行算子三大基本内容,此外它还涉及到数据存储的方式变化。

二、存储方式 


「原地更新、多版本更新」

在UPDATE命令中,待更新的数据行会存在旧版本,和更新后的新版本两份数据,如何处理这两份数据,在其它商业数据库中常常提到的原地更新、多版本更新。

「NEW to OLD、OLD to NEW」

当对同一数据行执行多次UPDATE命令时,就会存在一个版本链,我们知道对于链式结构,有一个链头和一个链尾,对于多个版本的链存在两种组织方式,最新版本在链头和最老版本在链头,也就是新到旧还是旧到新。

「旧版本清理」

不同的存储方式会影响数据库中其它模块的实现机制,比如采用多版本更新机制时,就需要旧版本的清理机制,来保障完全不使用的旧版本数据不会占用过多的存储空间。

 三、思考 


在前面数据库内核实现的基础之上,本章继续介绍UPDATE命令的在数据库内核中的实现过程,分别从词法语法解析、执行计划生成以及执行算子三大方面进行分析和实现,在开始之前我们首先来思考几个问题:

  1. UPDATE命令中如何找到待修改的数据行?
  2. 当修改的数据值大于原来的数据值时,如何处理?比如修改字符串类型的字段,从”123”修改为”12345”,原来的空间不够存放新值。
  3. UPDATE命令中,是否有必要保留修改前的旧值? 带着自己的答案开始新的内容。

 四、语法介绍 


UPDATE命令的基本语法由四个子句组成,其中两个子句为可选。

    ounter(line
    UPDATE table_name SET column1 = value1, column2 = value2, … [FROM table_name1, table_name2, … ] [WHERE conditions]; 

    「说明」

    • table_name,修改的数据表;
    • column1、column2,table_name中的属性列;
    • value1、value2,将目标属性列设置的值;可以是常量值,也可以是表达式形式;
    • FROM子句,可选项;与其它表进行条件联接;这里的表名称列表不需要包括待修改表table_name;
    • WHERE子句,可选项;带过滤条件的查询,对查询结果中的数据行进行修改;如果不带过滤条件时,作用域为所有的数据行。

    还有一种多个属性列修改为相同值的简便写法:

      ounter(line
      UPDATE table_name SET (column1, column2, … ) = value1 [FROM table_name1, table_name2, … ] [WHERE conditions];

      多个属性列名称同时设置为相同的value1值,以上两种写法可以混合在同一条SQL语句中。

      SQL标准定义了语法主体,各商业数据库中实现语法细节不尽相同,对于多表关联查询我们这里通过FROM子句和WHERE子句来实现,这些与SELECT语法保持一致,减少语法学习的复杂度,同时这样也更灵活,可以有更复杂的联接查询。


      🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀


      【往期精彩推荐】

      【手写数据库核心揭秘系列】第99节 多表联合查询演示,高复杂度查询SQL,四张数据表混合联合类型的查询

      【手写数据库内核miniToadb】第36天 数据文件操作

      【手写数据库核心揭秘系列】第76讲 普通表生成扫描节点,无条件下多表查询为何可能引发性能灾难?


      文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论