数据库 ·

网易MySQL微专业学习笔记(十)-MySQL存储引擎

前言

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

所有笔记可能不定期更新,发布时不一定为最终版。

正文

Mysql存储引擎

有多种可选方案,可插拔,可修改存储引擎
基于表选择使用何种存储引擎
create table test(a int) engine = innodb;
show engines;

InnoDB存储引擎

索引组织表
支持事务
支持行级锁
数据块缓存
日志持久化
稳定可靠,性能好,线上尽量使用InnoDB

MyISAM存储引擎

堆表
不支持事务
只维护索引缓存池,表数据缓存交给操作系统
锁力度较大--导致并发性能非常差
数据文件可以直接拷贝,偶尔可能会用上
不建议线上业务数据使用

MEMORY存储引擎

数据全内存存放,无法持久化
性能较高
不支持事务
适合偶尔作为临时表使用
临时表仅在当前链接中有效,其他链接无法访问。
create temporary table tmp(id int) engine = memory;

BLACKHOL存储引擎

数据不作任何存储,如果直接保存在里面,会被直接丢掉。
利用Mysql Replicate,充当日志服务器
在Mysql Replicate环境中充当代理主

TokuDB

分形树存储结构
支持事务
行锁
压缩效率较高
适合大批量insert的场景

Mysql Cluster

多主分布式集群
数据节点间冗余,高可用
支持事务
设计上易于扩展
面向未来,线上慎用

改变表的存储引擎

alert table m ENGINE = innodb;

InnoDB存储引擎

架构

     内存空间
     后台各种线程()
     磁盘上的文件

物理文件

     数据文件、日志文件

InnoDB系统表空间

ibdata1存放什么:
     回滚段
     所有InnoDB表元数据信息
     Double Write,Insert buffer dump等
自动扩展机制
日志文件
表定义文件
表名.
表数据文件

InnoDB数据文件存储结构

索引组织表(聚簇表)
根据表逻辑主键排序
数据节点每页16k--二分查找
根据主键寻址速度很快
主键值递增的insert插入效率较好
主键随机insert插入操作效率较差
因此,InnoDB表必须指定主键,建议使用自增数字

InnoDB数据块缓存池

数据的读写需要经过缓存
数据以整页(16k)为单位读取到缓存中
缓存中的数据以LRU策略换出
IO效率高,性能好

InnoDB数据持久化与事务

事务日志实时持久化
内存变化数据(脏数据)增量异步刷出到磁盘
实例故障考重放日志恢复
性能好,可靠,恢复快

InnoDB行级锁

写不阻塞读
不同行间的写相互不阻塞
并发性能好

InnoDB与事务ACID

事务ACID特效完整支持
回滚段失败回滚(A)
支持主外键约束(C)
事务版本+回滚段=MVCC(I)
事务日志持久化(D)
默认可重复读隔离级别,可以调整

事务锁粒度

行锁
InnoDB,Oracle
页锁
SQL Server
表锁
MyISAM,Memory
锁升级

InnoDB的gap lock

什么是幻读
A连接开启一个事务,并查处一个值,幻读情况下,在B连接中插入一个值,A连接再次查询时读取到的情况。
gap locak 消灭幻读
     InnoDB消灭幻读仅仅为了确保statement模式replicate的主从一致性
自增主键做条件更新,性能最好

参与评论