关系型数据库 | 青训营笔记

172 阅读2分钟

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

RDBMS

事务ACID

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

引擎

SQL引擎

Parser

一般分为词法分析、语法分析、语义分析等

Optimizer

  • 基于规则的优化RBO,表连接优化;scan优化(唯一索引、普通索引)等
  • 基于代价的优化CBO

Executor

火山模型

函数调用层次往下,返回层次往上

  • 优点:每个算子独立抽象,相互之间没有耦合,逻辑结构简单
  • 缺点:每计算一条数据由多次函数调用开销,导致CPU效率不高
向量化

每次操作计算不再是一行数据,而是一批数据,计算完成后向上层算子返回一个batch(n行数据)

  • 优点:函数调用次数降低为1/N,CPU cache命中率更高

编译执行

实现基础算子的功能,LLVM动态编译技术:动态生成执行代码逻辑

存储引擎

InnoDB

Budder Pool

重要结构:hash map,LRU

Page

变长字段列表,null值标志位,header,row_id,trx_id,roll_ptr,col1,col2...

Header:delete_mask,next_record

B+ Tree

页面内:使用二分快速定位到对应的槽,然后再遍历该槽

事务引擎

原子性与undo log

mysql:undolog实现了多版本并发控制MVCC

一致性

一般由业务层实现,一般不由数据库层次实现

隔离性与锁

MVCC语义:

  • 读写互不阻塞
  • 降低死锁概率
  • 实现一致性读

持久性与redo log

如果数据写入磁盘前故障,重启MySQL后会更具redo log重做

数据库实践

大流量

背景

  • 单节点写容易成为瓶颈
  • 单机数据容量有限

解决方案

  • 业务数据进行水平拆分
  • 代理层进行分片路由

实现效果

  • 数据库写入性能线性扩展
  • 数据库容量线性扩展

扩容

背景

  • 活动流量上涨
  • 集群性能不能满足要求

解决方案

  • 扩容DB物理节点数量
  • 利用影子表进行压测

实现效果

  • 数据库集群高吞吐
  • 保证集群可以承担预期流量

代理连接池

背景

  • 大流量导致大量建联
  • 大量建联导致负载变大,延时上升

解决方案

  • 业务侧预热连接池
  • 代理侧预热连接池
  • 代理测支持连接队列

实现效果

  • 避免DB、代理 done

稳定性&可靠性

  • 3AZ高可用
  • 代理读写分离
  • 监控报警

HA管理