这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。
所有笔记可能不定期更新,发布时不一定为最终版。
有多种可选方案,可插拔,可修改存储引擎
基于表选择使用何种存储引擎
create table test(a int) engine = innodb;
show engines;
索引组织表
支持事务
支持行级锁
数据块缓存
日志持久化
稳定可靠,性能好,线上尽量使用InnoDB
堆表
不支持事务
只维护索引缓存池,表数据缓存交给操作系统
锁力度较大--导致并发性能非常差
数据文件可以直接拷贝,偶尔可能会用上
不建议线上业务数据使用
数据全内存存放,无法持久化
性能较高
不支持事务
适合偶尔作为临时表使用
临时表仅在当前链接中有效,其他链接无法访问。
create temporary table tmp(id int) engine = memory;
数据不作任何存储,如果直接保存在里面,会被直接丢掉。
利用Mysql Replicate,充当日志服务器
在Mysql Replicate环境中充当代理主
分形树存储结构
支持事务
行锁
压缩效率较高
适合大批量insert的场景
http://www.tokutek.com/tokudb-for-mysql/download-community/
多主分布式集群
数据节点间冗余,高可用
支持事务
设计上易于扩展
面向未来,线上慎用
alert table m ENGINE = innodb;
内存空间
后台各种线程()
磁盘上的文件
数据文件、日志文件
ibdata1存放什么:
回滚段
所有InnoDB表元数据信息
Double Write,Insert buffer dump等
自动扩展机制
日志文件
表定义文件
表名.
表数据文件
索引组织表(聚簇表)
根据表逻辑主键排序
数据节点每页16k--二分查找
根据主键寻址速度很快
主键值递增的insert插入效率较好
主键随机insert插入操作效率较差
因此,InnoDB表必须指定主键,建议使用自增数字
数据的读写需要经过缓存
数据以整页(16k)为单位读取到缓存中
缓存中的数据以LRU策略换出
IO效率高,性能好
事务日志实时持久化
内存变化数据(脏数据)增量异步刷出到磁盘
实例故障考重放日志恢复
性能好,可靠,恢复快
写不阻塞读
不同行间的写相互不阻塞
并发性能好
事务ACID特效完整支持
回滚段失败回滚(A)
支持主外键约束(C)
事务版本+回滚段=MVCC(I)
事务日志持久化(D)
默认可重复读隔离级别,可以调整
行锁
InnoDB,Oracle
页锁
SQL Server
表锁
MyISAM,Memory
锁升级
什么是幻读
A连接开启一个事务,并查处一个值,幻读情况下,在B连接中插入一个值,A连接再次查询时读取到的情况。
gap locak 消灭幻读
InnoDB消灭幻读仅仅为了确保statement模式replicate的主从一致性
自增主键做条件更新,性能最好