Mysql核心原理
2021-03-06 20:05:36 4 举报
AI智能生成
为你推荐
查看更多
Mysql原理
作者其他创作
大纲/内容
事务
原子性
持久性
隔离性
一致性
事务的演进
排队执行
使用队列执行并发事务,如同redis
排他锁
引入锁之后就可以支持并发处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。
读写锁
读和写操作:读读、写写、读写、写读。读写锁就是进一步细化锁的颗粒度,区分读操作和写操作,让读和读之间不加锁,这样下面的两个事务就可以同时被执行了。读写锁,可以让读和读并行,而读和写、写和读、写和写这几种之间还是要加排他锁。
MVCC
多版本控制MVCC,也就是Copy on Write的思想。MVCC除了支持读和读并行,还支持读和写、写和读的并行,但为了保证一致性,写和写是无法并行的。在事务开始写操作的时候会copy一个记录的副本,其他事务读操作会读取这个记录副本,因此不会影响其他事务对此记录的读取,实现写和读并行。
MVCC最大的好处是读不加锁,读写不冲突。在读多写少的系统应用中,读写不冲突是非常重要的,极大的提升系统的并发性能,这也是为什么现阶段几乎所有的关系型数据库都支持 MVCC 的原因,不过目前MVCC只在 Read Commited 和 Repeatable Read 两种隔离级别下工作。
在 MVCC 并发控制中,读操作可以分为两类: 快照读(Snapshot Read)与当前读 (Current Read)。快照读:读取的是记录的快照版本(有可能是历史版本),不用加锁。(select)当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加锁,保证其他事务不会再并发修改这条记录。(select... for update 或lock in share mode,insert/delete/update)
MVCC原理
快照链
ReadView
m_ids
min_trx_id
max_trx_id
creator_trx_id
锁
页锁
表锁
读锁
写锁
意向读锁
意向写锁
行锁
Record Lock
Gap Lock
Next-key Lock
Mysql集群
可用性
保证高可用的方法是冗余。但是数据冗余带来的问题是数据一致性问题。
最近数据读主库
拓展性
主从读拓展
分库分表读写拓展
主从模式
实时灾备,用于故障切换(高可用)
读写分离,提供查询服务(读扩展)
数据备份,避免影响业务(高可用)
主从异步复制原理
主从半同步复制
主从并行复制
双主模式
MMM
主从MHA
组成
MHA Manager(管理节点)
和MHA Node(数据节点)
原理
MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。
故障切换
表分区
将整个表按每个分区分成多个ibd文件
对于引擎层来说,这是 4 个表;
对于 Server 层来说,这是 1 个表。
分库分表
垂直拆分
一个库中的表拆到多个库
一个表拆按字段和业务成多个表
水平拆分
分片
范围
hash取模
一致性hash
扩容方案
停机扩容
平滑扩容
Mysql海量数据优化
数据库架构演变
单机单库
数据量太大,一台机器无法承受
读写操作量太大,超出一台机器承受
一旦数据库宕机,应用整体崩溃,可用性低
主从架构(读写分离)
数据量太大,超出一台服务器承受能力
写操作量大,超过master承受能力
sass云数据库
体系架构
Server层
连接器
缓存
分析器
优化器
执行器
存储引擎层
InnoDB
MyISm
系统文件层
日志文件
error log
general log
bin log
slow query log
InnoDB日志
redo log
undo log
配置文件
my.cnf/my.ini
数据文件
内存结构
Buffer Pool
free list
flush list
lru list
Change Buffer
Log Buffer
Adaptive Hash Index
Buffer Pool在线扩容
数据库偶发抖动
大数据量查询导致Buffer Pool需要腾出空间,淘汰未使用的脏页需要刷入磁盘
redolog写满后触发的刷脏
Buffer Pool线程安全问题
Buffer Pool分为多个instance,共享资源加锁,多个实例可以降低锁的粒度
磁盘结构
系统表空间
数据字典
Doublewrite Buffer
Undo Logs
独立表空间
文件结构
TableSpace
Segment
Extent
Page
Row
数据存储格式
文件格式
Antelope
Barracuda
行格式(Row_format)
四种行格式支持
通用表空间
undo 表空间
临时表空间
redo Log
后台线程
IO Thread
Purge Thread
Page Cleaner Thread
Master Thread
日志
Undo Log
Redo Log
索引
索引类型
从索引存储结构划分:B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引
从应用层次划分:普通索引、唯一索引、主键索引、复合索引
从索引键值类型划分:主键索引、辅助索引(二级索引)
从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)
索引原理
二分查找
Hash表
B-tree
索引值和data数据分布在整棵树结构中
每个节点可以存放多个索引值及对应的data数据
树节点中的多个索引值从左到右升序排列
B+tree
非叶子节点不存储data数据,只存储索引值,这样便于存储更多的索引值
叶子节点包含了所有的索引值和data数据
叶子节点用指针连接,提高区间的访问性能
执行计划
type
NULL:表示不用访问表,速度最快。
const:表示使用主键或唯一索引做等值查询,常量查询。
eq_ref:一般情况下出现在多表join查询,表示前面表的每一个记录,都只能匹配后面表的一行结果。
ref:表示使用非唯一索引进行单值查询。
range:表示使用索引范围查询。使用>、>=、<、<=、in等等。
index:表示基于索引的全表扫描,先扫描索引再扫描全表数据。
ALL:表示全表扫描,性能最差。
key
rows
Extra
Using where
Using index
Using index Condition
Using filesort
Using temprorary
索引优化
离散度高的键做索引
覆盖索引和索引下推,优化回表查询
最左前缀
like查询
字符串倒序索引,hash索引或前缀索引
索引字段排序
新特性倒排索引
分页查询优化
如果可以找到偏移的那条数据,就可以达到优化目的
0 条评论
回复 删除
下一页