概述

什么是数据库,什么是数据库实例?
数据库是:数据存储文件的集合
数据库实例:本质上是系统的进程,用来访问和控制数据存储文件集合

Mysql各个引擎的特点

  • InnoDB:支持事务,行锁,提供快照读,面向目标场景是OLTP
  • MyISAM:不支持事务,支持全文索引,表锁,只缓存索引文件,面向OLAP
  • NDB:是集群存储引擎,把全部索引加载在内部,增加数据节点,可以线性的增加数据库性能。类似oracle的RAC

InnoDB的后台线程类型

Master Thread
核心线程,负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,脏页的刷新,合并插入缓冲,undo页的回收

IO Thread
负责异步IO请求的回调处理。write、read、insert bufer和log IO thread。

Puerge Thread
事务提交后,undo log可能不再需要,由PurgeThread来回收以及使用并分配的undo页

Page Cleaner Thread
将脏页的刷新操作,由此线程负责。降低了master thread的工作。减少对用户查询的阻塞

InnoDB缓冲池

概述
InnoDB引擎是基于磁盘存储的,将记录按页的方式管理。为了协调CPU的高速与磁盘的低速,缓存磁盘的数据在内存中,提高整体性能。

作用

  • 维护所有进程/线程需要访问的多个内部数据结构
  • 缓存磁盘上的数据,方便快速读取,对磁盘的文件的数据修改之前在这里缓存
  • 重做日志缓冲

定义

  • 数据库读取页的操作,会首先把系统文件中的页,读取到缓冲区的页中,这个动作叫将页FIX到缓冲池。若下一次读取相同的页,就先判断页是否在缓冲池中。
  • 对数据库的页修改操作,首先修改缓冲池的页,再以一定频率刷新到磁盘。这个一定的频率控制,以及触发刷新的动作,叫做Checkpoint机制。

LRU List、Free List和Flush List
LRU列表用来管理已经读取的页
Free列表用来存放可用的空闲页

当数据库启动时,LRU列表是空的,从free列表中删除后放入LRU列表的midpoint位置,如果free列表无可用,则LRU淘汰old部分的末端。并提供了midpoint优化。

midpoint机制:首次插入到尾端的innodb_old_blocks_pct的位置,把此位置之后的列表称为old列表,之前的列表称为new列表。页经过innodb_old_blocks_time次数后,从old进入到new部分.这么做的目的是方法query很多数据到缓冲池时,会把热页lru出队列。

page made young:把lru的页从old部分放入new部分
page not made young:因为innodb_old_blocks_time导致没有放入new

innodb的页默认是16kb大小,也支持压缩,压缩后的页通过unzip_lru列表管理。
unzip_lru列表分别对不同压缩页大小的页进行分别管理。通过伙伴算法分配页。

重做日志缓冲
重做日志缓冲区在缓冲池之外,innodb先把重做日志信息放到这个缓冲区,再按一定频率将其刷新到重做日志文件。innodb_lig_buffer_size控制大小,默认是8mb。
此缓冲区刷新的时机:

  • master thread每秒刷新
  • 每个事物提交时刷新
  • 当可用空间小于50%时刷新

额外的内存池
用来分配缓冲池对象的内存区

Checkpoint技术

设计了缓冲池是为了减少频繁写入磁盘。提供数据库性能。当前事物数据库采用write ahead log策略。先写日志,再修改页。当数据库宕机时,可以通过重做日志来回复数据。但是数据库允许很久之后,重做日志会非常大,那么数据库宕机后回复的时间会很久。
那么checkpoint(检查点)技术是来解决以下几个问题:

  • 缩短数据库恢复时间
  • 缓冲池不够用时,将藏页刷新到磁盘
  • 重做日志不可用时,刷新脏页。

当数据库宕机后,只需要重做checkpoint之后的页。
当缓冲池不够用,强制刷新到磁盘。
当重做日志不可用时,将缓冲池中的页至少刷新到当前的重做日志的位置。

对于innodb通过LSN(log sequence number)来标记版本。每个页有LSN,重做日志也有LSN,checkpoint也有LSN。

类型

  • sharp checkpoint:在数据关闭时将所有的脏页都刷新到磁盘
  • fuzzy checkpoint:刷新一部分脏页回磁盘,保证数据库的整体性能

fuzzy checkpoint的类型

  • master thread checkpoint:差不多以每秒或十秒的速度从缓冲池的脏页列表刷新一定比例的页回磁盘。异步操作
  • flush_lru_list checkpoint:保证lru列表有足够的空间放下用户查询的缓冲页,在page cleaner线程在free列表中要保证有innodb_lru_scan_depth个数的可用页,当低于此值时,属性lru列表末端的脏页
  • async/sync flush checkpoint:保证重做日志有足够的空间。(这个检查操作在page cleaner线程中执行)checkpoint_age = redo_lsn - checkpoint_lsn。具体刷新规则
  • dirty page too much checkpoint:当脏页的数量太多,强制刷新一部分到磁盘。innodb_max_dirty_pages_pct控制,默认值是75%

InnoDB的特性

  • insert buffer
  • double write
  • 自适应hash索引
  • 异步IO
  • 刷新邻接表

插入缓冲

Insert Buffer

innodb引擎中,数据页的存放是按主键的顺序存放的,那么插入是很快的。但是一些非聚集且不唯一的辅助所以,在插入索引时,是离散的,因此性能不高。
插入缓冲是用来存放辅助索引的缓冲。对于非聚集索引的插入或者更新操作,判断是否在缓冲池中,如果在就直接插入,如果不在,则先插入到insert buffer对象。再以一定的频率和情况进行insert buffer和辅助索引页子节点的merge操作。往往能将多个插入合并到一个操作,提辅助索引的插入性能。
使用条件

  • 索引是辅助索引
  • 索引不是唯一的(因为在插入时不会判断是否唯一)

对于写操作频繁的系统,会导致insert buffer太大,可以通过ibuf_pool_size_per_max_size对插入缓冲的大小进行控制。占用的大小为1/ibuf_pool_size_per_max_size

Change Buffer

可以视为insert buffer的升级版,对dml操作,insert、delete、update都做了缓冲。分别是insert buffer、delete buffer、purge buffer
适用的对象依然是非唯一的辅助索引。
对一条记录进行update操作可分为两个过程:

  • 将记录标记为已删除
  • 真正将记录删除

Delete Buffer对应UPDATE操作的第一个过程,即将记录标记为删除。Purge Buffer对应UPDATE操作的第二个过程,即将记录真正的删除

Insert Buffer的内部实现

一颗b+树,具体咋实现的看不懂。提升索引插入性能

两次写

提供数据页的安全性,避免宕机导致的页缺失

自适应哈希索引

自适应hash索引是innodb对热页访问的优化。缓冲池中的热页在达到一定条件后,建立hash索引。
转换成hash索引的条件:

  • 以该模式访问了100次
  • 页通过该模式访问了N次,其中N=页中记录*1/16

异步IO

为了提供访问磁盘的性能,使用异步IO。发出一个IO请求后,紧接着发出另一个IO,等待全部IO请求完成后,再等待所有IO操作完成。
AIO底层有merge IO的优化,进一步提供访问的性能

刷新邻接页

innodb在刷新一个脏页时,会判断页所在的区是否有其他脏页,如果一起刷新的话,可以利用aio的特性,提供刷新的性能。
固态硬盘有很高的IOPS,可以不启动此特性。机械硬盘推荐开启。

InnoDB存储引擎:引擎概况相关推荐

  1. mysql idataparameter_MySQL技术内幕——InnoDB存储引擎笔记

    第一章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库 :物理操作系统文件或其他形式类型文件的集合 实例 : MySQL数据库由后台线程以及一个共享内存区组成. Mysql数据库实例在 ...

  2. Mysql技术内幕——InnoDB存储引擎

    一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...

  3. InnoDB 存储引擎中的表锁和行锁详解

    各位对 "锁" 这个概念应该都不是很陌生吧,Java 语言中就提供了两种锁:内置的 synchronized 锁和 Lock 接口,使用锁的目的就是管理对共享资源的并发访问,保证数 ...

  4. linux mysql innodb_MySQL innoDB 存储引擎学习篇

    master thread的县城优先级别最高.其内部由几个循环(loop)组成:主循环(loop).后台循环(background loop).刷新循环(flush loop).暂停循环(suspen ...

  5. 《MySQL技术内幕:InnoDB存储引擎第2版》——3.1 参数文件

    3.1 参数文件 在第1章中已经介绍过了,当MySQL实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认 ...

  6. mysql1033错误存储引擎_【Mysql问题集锦(1)】mysql不能使用innodb存储引擎

    案例: 一台服务器,操作系统centos,使用 yum 安装mysql ,之前innodb存储引擎一直是可以用的,某天之后,突然不能用了,使用innodb存储引擎的数据库导入后存储引擎全部变成了myi ...

  7. mysql 5.7 存储引擎_mysql5.7——innodb存储引擎总结

    一.innodb初探: 1.MySQL日志文件: ①:slow.log 文件会记录慢查询日志,当一条语句执行时间超过在配置参数long_query_time中指定的值时,这条语句就会被记录在这个文件中 ...

  8. mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  9. InnoDB 存储引擎体系架构

    首先以一张图简单展示 InnoDB 的存储引擎的体系架构.从图中可见, InnoDB 存储引擎有多个内存块,这些内存块组成了一个大的内存池,主要负责如下工作: 维护所有进程/线程需要访问的多个内部数据 ...

  10. 11、InnoDB存储引擎

    InnoDB 是 MySQL 中第一个提供外键约束的存储引擎,而且它对事务的处理能力是其它存储引擎无法与之相比的. MySQL 5.5 版本以后,默认存储引擎由 MyISAM 修改为 InnoDB.I ...

最新文章

  1. linux下查看所有用户及所有用户组
  2. idea android 模块,IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”...
  3. 刷脸考勤,重新定位校园管理
  4. 使用 Time Machine 恢复 .ssh等隐藏文件夹
  5. Linux系列 | 了解nohup和的功效
  6. 突破封锁的浏览器_零的突破!重庆第一台全国产电脑到底长什么样?
  7. WinPE启动U盘工具箱 (通用PE工具箱ISO映像文件)
  8. IDEA MyEclipse Eclipse 快捷键大全(最终版)
  9. 河南省第十届ACM程序设计大赛参赛心得
  10. 了解torch.nn.DataParallel
  11. Android-黑客技术-实现类似电脑版软件破解版
  12. PE头之IMAGE_FILE_HEADER解析
  13. MSXML的不同版本使用
  14. 第9节-学会使用cookie-互动练习-“解密加密文章”
  15. 学习笔记——VLSI测试方法学和可测性设计
  16. Java语言-27:Map接口
  17. 三分法 three-way partitioning
  18. Photoshop CS2 视频教程-PS色彩范围(转)
  19. Java程序练习-潜伏者
  20. 【k8s金牌知识】k8s升级攻略

热门文章

  1. c语言欧几里得算法求素数,jrs直播(无插件) -官网
  2. 终于解决了Chrome:“喔唷,崩溃啦“
  3. 8.0服务器维护时间,魔兽世界8.0开服第一天遇紧急维护?网友:叫逆水寒还服务器...
  4. 乘风破浪的码农——仿佛身体被掏空
  5. c语言程序设计第五版课后习题答案谭浩强第八章课后题
  6. 计算机网络各层设备及功能讲解大汇总~
  7. 最全大数据学习资源整理
  8. 海康威视校招C++岗面经
  9. 封装实现电子宠物系统的企鹅类正确输入健康值和亲密度
  10. restframework(一)