重做日志缓存
- 重做日志缓冲(redo log buffer)
- 重做日志缓冲同样也在innodb内存区。innodb存储引擎会将重做日志信息先放到重做日志缓冲区,然后以一定的频率刷新到重做日志中。
- 重做日志缓冲不必太大。因为一般每一秒都会刷新到重做日志文件中。默认为8MB,该值可以由innodb_log_buffer_size控制
- 重做日志缓冲刷新的三种情况。1.master thread每一秒都会刷新一次。 2.每次事务提交时都会刷新一次。 3.重做日志缓冲池剩余空间小于1/2时,会刷新。
额外的内存池
- 额外的内存池
- innodb存储引擎采用一种称为内存堆的方式进行。在给一些数据结构分配内存时,会从额外的内存池中申请,但该内存中的内存不足时,会从缓冲池中申请。
SQL语句的分类
- 数据库查询语言DQL
-各种查询 - 数据操纵语言DML
- 增删改
- 数据定义语言DDL
- 用来创建数据库中的各种对象,如表,视图,索引等
- 数据控制语言DCL
- 授权,回滚数据库等
checkpoint技术
- checkpoint技术的目的
- 缩短数据库恢复时间
- 缓冲池不够用时,将脏页刷新到磁盘
- 重做日志不可用时,刷新脏页
- 两种checkpoint
- sharp checkpoint(默认);在数据库关闭时将所有脏页刷新到磁盘,配置参数为innodb_fast-shutdown=1
- fuzzy checkpoint发生的几种情况
- master thread checkpoint
- FLUSH_LRU_LIST checkpoint
- Async/Sync Flush checkpoint
- dirty page too much checkpoint
master thread 的工作方式
- 1.0.x之前的版本
- master thread既有最高的线程优先级。内部包括多个循环。有主循环,后台循环,刷新循环,暂停循环。master thread会根据数据库的运行状态在这几个循环之间切换
- 主循环以一定的频率执行。每秒执行一次:1.将日志缓冲刷新到磁盘,即使事务还没有提交 2.可能会合并插入缓冲 3.最多刷新100个缓冲池中的脏页到磁盘。 4.没有用户执行任何操作时切换到后台循环
- 每10秒执行一次:1.刷新100个脏页到磁盘(可能)。 2。合并至多20个插入缓冲(总是) 3.将日志缓冲刷新到磁盘(总是) 4.删除无用的undo页(总是) 5.刷新100个或者10个脏页到磁盘(总是)
- 为了解决innodb硬编码规定的每秒刷新100个脏页合并20个插入缓冲的问题。可以使用innodb_io_capacity来控制刷新到磁盘的脏页的百分比。参数innodb_max_dirty_pages_pct调整脏页所占的比例。
- background loop
- 刷新无用的undo页(总是)
- 合并20个插入缓冲(总是)
- 跳回到主循环(总是)
- master thread既有最高的线程优先级。内部包括多个循环。有主循环,后台循环,刷新循环,暂停循环。master thread会根据数据库的运行状态在这几个循环之间切换
索引
- 索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针。
- 索引分为聚簇索引和非聚簇索引。聚簇索引是按数据存放的物理顺序为顺序的,而非聚簇索引则不是。聚簇索引能提高多行数据的检索速度,而非聚簇索引对单行数据检索更有效
- MySQL索引的分类
- 普通索引,没有任何限制
- 唯一索引,索引列的值必须唯一,但可以为空。
- 全文索引,仅可用于myisam表
- 单列索引,多列索引
- 组合索引
innodb的关键特性
插入缓存
- 插入缓存
- 为了解决非聚集索引页的离散性访问会使性能下降。在插入时,先判断该页是否在缓冲池中,如果在则之间插入。否则,加入插入缓存,再以一定的频率进行插入合并操作。
- 插入缓存的使用条件
- 索引是辅助索引
- 索引不是唯一的
两次写
- 两次写
自适应哈希索引
- 自适应哈希索引
- 为了提高查找的效率,innodb会自动的为某些热点页建立哈希索引。
- 访问模式:是指查询条件一样
- 建立哈希索引的条件
- 该模式访问了100次
- 页通过该模式访问了N次,其中N=页记录*1/16
异步IO
- 异步IO
- 为了提高磁盘操作的性能,采用了异步的IO,即AIO
刷新邻接页
- 刷新邻接页
- 当innodb存储引擎在刷新脏页到磁盘时,会检测该页所在的区是否还有脏页需要刷新到磁盘,有的话则一并刷新到磁盘。对应传统的机械硬盘性能提示较大。
