这是我参与[第五届青训营]伴学笔记创作活动的第 15 天
一条SQL的一生
SQL引擎-Parser
解析器(Parser)一般分为词法分析( Lexical analysis )、语法分析( Syntax analysis ) 语义分析(Semantic analyzer)等步骤
SQL引擎-Optimizer
基于规则的优化(RBO Rule Base Optimizer)
- 条件简化
- 表连接优化
- 总是小表先连接
- Scan优化
- 唯一索引
- 普通索引
- 全表扫描
基于代价的优化(CBO Cost Base Optimizer)
- 时间、IO、CPU、NET、MEM
SQL引擎一Executor
每个Operator调用Next操作,访问下层Operator,获得下层Operator返回的一行数据,经过计算之后,将这行数据返回给上层.
向量化
每个Operator每次操作计算的不再是一行数据,而是一批数据(Batch N行数据),计算完成后向上层算子返回一个Batch
优点
- 函数调用次数降低为1/N
- CPU cache命中率更高
- 可以利用CPU提供的SIMD(Single Instruction Multi Data)机制
编译执行
将所有的操作封装到一个函数里面,函数调用的代价也能大幅度降低
LLVM动态编译执行技术
存储引擎- InnoDB
In-Memory :
- Buffer Pool
- Change Buffer
- Adaptive Hash
- IndexLog Buffer
On-Disk :
- System Tablespace(ibdata1)
- General Tablespaces(xxx.ibd)
- Undo Tablespaces(xxx.ibu)
- Temporary Tablespaces(xxx.ibt)
- Redo Log(ib_logfileN)
存储引擎-Buffer Pool
缓冲池是主内存中的一个区域,用于按原样缓存表和索引数据访问。缓冲池允许经常使用的数据直接从内存访问,从而加快处理速度
缓冲池是分为可能包含多行的页面。为 缓存管理的效率,缓冲池实现为页面链接列表
缓冲池作为列表使用LRU的变体进行管理算法
哈希索引
事务引擎- Atomicity 与Undo Log
Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC),解决读写冲突和一致性读的问题
事务引擎- Isolation与锁
Share Lock , Exclusive Lock
事务引擎- Isolation 与 MVCC
MVCC的意义
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
Undo Log在MVCC的作用
- 每个事务有一个单增的事务ID
- 数据页的行记录中包含了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR
- DB_ROLLPTR将数据行的所有快照记录都通过链表的结构串联了起来
事务引擎- Durability 与Redo Log
如何保证事务结束后,对数据的修改永久的保存?
- 事务提交前页面写盘(随机IO,写放大)
- WAL(Write-ahead logging):redo log是物理日志,记录的是页面的变化,它的作用是保证事务持久化。如果数据写入磁盘前发生故障,重启MySQL后会根据redo log重做
实践
大流量- Sharding
解决方案
- 业务数据进行水平拆分
- 代理层进行分片路由
实施效果
- 数据库写入性能线性扩展
- 数据库容量线性扩展
流量突增-扩容
解决方案
- 扩容DB物理节点数量
- 利用影子表进行压测
实施效果
- 数据库集群提供更高的吞吐
- 保证集群可以承担预期流量
流量突增一代理连接池
解决方案
- 业务侧预热连接池
- 代理侧预热连接池
- 代理侧支持连接队列
实施效果
- 避免DB被突增流量打死
- 避免代理和DB被大量建联打死
稳定性&可靠性-3AZ高可用
多机房部署,通过日志和代理将机房连接起来
稳定性&可靠性-HA管理
问题背景
- db所在机器异常宕机
- db节点异常宕机
解决方案
- ha服务监管、切换宕机节点
- 代理支持配置热加载
- 代理自动屏蔽宕机读节点
实施效果
- 读节点宕机秒级恢复
- 写节点宕机30s内恢复服务
参考资料
LLVM: t.csdn.cn/cVHRM
Buffer Pool:dev.mysql.com/doc/refman/…