SQL基础 | 青训营笔记

86 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 13 天。

  • SQL语言:结构化查询语言,语法风格接近自然语言,高度非过程化,面向集合的操作方式,语言简洁,易学易用

  • SQL执行流程:数据库接收到SQL后,Parser模块解析SQL语句,生成语法树AST,Optimizer优化器根据语法树生成Plan(树状结构),executor执行plan,从文件中读取数据,返回数据,写入数据等,返回结果到用户。

  • SQL引擎

    • Parser:解析器,一般分为词法分析 (Lexical analysis )、语法分析 ( Syntax analysis )、语义分析 ( Semantic analyzer ) 等步骤.

    • optimizer:优化器判断那种执行方式是最优的方式

      • 基于规则的优化(RBO, Rule Base Optimizer)

      • 基于代价的优化(CBO,Cost Base Optimizer):一个查询有多种执行方案,CBO会选择其中代价最低的方案去真正的执行。代价,时间

    • Executor

      • 火山模型 :逐层向下调用,数据逐层向上返回

      • 向量化模型:适合大批量数据处理,对于很多单行数据处理没有优势。往往搭配列式存储使用

        • simd机制:一条CPU指令里可以计算多条数据

      • 编译执行:把所有逻辑代码写入一个函数里,就没有函数调用了。把不同算子合在一个函数里,动态编译技术,拿到plan后动态生成代码编译路径

  • 存储引擎—InnoDB

    • 分为两部分,内存In-Memory和磁盘On-Disk

    • In-Memory:

      • Buffer Pool:用作数据缓存
      • Change Buffer
      • Adaptive Hash Index
      • Log Buffer:写日志先写到这个buffer,再写到磁盘上
    • On-Disk:

      • System Tablespace(ibdata1):系统表,存元数据,表名列名属性等

      • General Tablespaces(xxx.ibd):表中存有什么数据

      • Undo Tablespaces(xxxibu):存日志

      • Temporary Tablespaces(xxx.ibt)

      • Redo Log(ib_logfileN):存日志

    • Buffer Pool:

      • 每个chunk的大小一般为128M,每个block对应一个page,一个chunk下有8192个block。这样可以避免内存碎片化。分成多个instance,可以有效避免并发冲突。page id % instance num得到它属于那个insatnce

      • 两个重要结构:hashmap,通过page id找到block。LRU,管理内存空间,把最近最常使用的保存在内存

    • Page:Innodb会把内存分成一个个16k的内存空间,在磁盘上存储是按page存储的

    • B+ Tree:构建索引

  • 事务引擎

    • 原子性:undo log用来将数据库回退到修改之前的状态

      • Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制( MVCC )解决读写冲突和一致性读的问题。
    • 一致性:业务上实现

    • 隔离性:锁,MVCC

    • 持久性:redo log

  • 总结

    学习了SQL语句的执行流程,SQL引擎,存储引擎和事务引擎的组成和原理。