DML语句处理
数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心
DML的主要功能即是访问数据,因此其语法都是以读取与写入数据库为主,除了INSERT以外,其他指令都可能需搭配WHERE指令来过滤数据范围,或是不加WHERE指令来访问全部的数据
数据库还支持REPLACE和INSERT INTO...ON DUPLICATED KEY UPDATE两种DML语句
所有的 DML 语句都会生成对应的执行计划来进行数据的读写操作,每一种 DML 语句都会生成一种对应的 DML 算 子。DML 算子负责读取数据,并通过存储层提供的数据写入接口将 DML 语句涉及到的数据写入存储引擎中
DML语句处理-INSERT执行计划示例
对于INSERT/REPLACE语句而言,由于其不用读取表中的已有数据,因此,INSERT语句的执行计划相对简单,其执行 计划为简单的EXPR VALUES+INSERT OP算子构成:
DML语句处理-UPDATE执行计划示例
对于UPDATE或者DELETE语句而言,优化器会通过代价模型对WHERE条件进行访问路径的选择,或者ORDER BY数据 顺序的选择:
DML语句处理-DELETE执行计划示例
对于UPDATE或者DELETE语句而言,优化器会通过代价模型对WHERE条件进行访问路径的选择,或者ORDER BY数据顺序的选择:
DML语句处理-一致性校验
DML操作的表对象每一列都有相关的约束性定义,例如列的NOT NULL约束,UNIQUE KEY约束等。为保证写入数据的类型同 Schema 中列定义的类型保持一致,在 DML语句最终写入数据前需要进行如下操作:
1.对列的 NOT NULL、UNIQUE KEY 约束检查
2. 对写入数据进行类型转换
约束性检查失败,需要回滚该DML语句写入的脏数据
DML语句处理-锁管理
加锁时机 -通过MVCC和锁结合的机制
只有行锁,没有表锁;在线DDL,不中断DML
尽量避免大量DML语句对同一行进行频繁的并发读写
热点行:可以使用SELECT...FOR UPDATE先对该行加锁,然后再执行DML操作
加锁顺序
DML会级联的同步更新数据表中的数据和索引表中的数据
local index 和 单表 global index,绑定
分区表global index,完全独立