InnoDB存储引擎
1.MySQL常用的几大存储引擎介绍
//通过该命令可查看当前mysql支持的存储引擎
show engines;
1.InnoDB
InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用
特点:
- 行锁
- 支持外键
- 非锁定读(默认读不会产生锁)
MySQL5.5.8开始,InnoDB是默认存储引擎
InnoDB通过使用MVCC(多版本并发控制)来获取高并发,并且实现了SQL标准的4种隔离级别,默认是Repeatable级别。同时使用一种叫next-key locking的策略来避免幻读。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次写(double buffer)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
InnoDB采用了聚集(涉及B+树)的方式,因此每张表的主键都是按顺序存储的,没有显示的定义主键时,会为每一行生成一个6个字节的RowId作为主键
2.MyISAM
MyISAM不支持事务、表锁涉及,但支持全文索引
3.NDB
集群存储引擎,数据放在内存中(5.1版本开始,非索引数据可以放在磁盘上),主键查找极快
4.Memory
数据存放在内存中,非常适合存储临表、数据仓库的纬度表;默认使用的hash索引
5.Archive
只支持insert和select操作
2.InnoDB来了
1.这是InnoDB简单的架构图
内存池:
- 维护所有的进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据,加快访问速度。同时在对磁盘文件数据修改之前在这里缓存
- 重做日志(redo log)缓冲
后台线程:主要负责刷新内存池中的数据,保证缓冲池的缓存是最近的数据;将已修改的数据文件刷新到磁盘文件,发生异常时也能借此恢复到正常状态
2.详细介绍后台线程
InnoDB是多线程模型,因此后台有多个不同的后台线程,负责处理不同的任务:
1.Master Thread
核心后台线程,主要负责将缓冲池的数据异步刷新到磁盘(包括脏页的刷新、合并插入缓冲、undo页的回收),保证数据的一致性
2.IO Thread
InnoDB中大量使用AIO(Async IO,异步io)来处理写请求,这样可以极大提高数据库性能。
IO Thread就是负责这些AIO的回调处理
3.Purge Thread
事务被提交后,其所使用的undolog可能不再需要,因此Purge Thread 就是来回收已经使用并分配的undo页
4.Page Cleaner Thread
其作用是将之前版本中的脏页刷新操作都放入到单独的线程中来完成,减轻原Master Thread的工作及对用户查询线程的阻塞,进一步提高InnoDB的性能
3.InnoDB内存介绍
|