文章目录
1、MySQL的组成
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插入式存储组件
- 物理文件
2、存储引擎
InnoDB存储引擎
- InnoDB存储引擎支持事务,主要面向在线事务处理(OLTP)方面的应用。InnoDB通过使用多版本并发控制(MVCC)来获得高并发性。同时使用一种称为next-key locking的策略来避免幻读现象的产生。InnoDB存储引擎还提供了插入缓冲、二次写、自适应哈希、预读等高性能和高可用功能。
MyISAM
- 其特点是不支持事务、表锁和全文索引,对于OLAP(在线分析处理)操作速度很快。由MYD和MYI组成,MYD用于存放数据文件,MYI用来存放索引文件。
Memory
- 将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适用于存储临时数据的临时表,以及数据库仓库中的维度表。MySQL数据库使用Memory存储引擎作为临时表来存放查询中间结果集。
3、InnoDB体系架构
- InnoDB有多个内存块,可以认为这些内存块组成一个大的内存池,负责:
- 维护所有进程、线程需要访问的多个内存数据结构
- 缓存磁盘上的数据,方便快速读取,并且对磁盘文件的数据进行修改之前在这里缓存。
- 重做日志缓存
4、后台线程
- 后台线程的主要作用是负责刷新内存池中的数据,保证缓存池中的内存缓存时最近的数据。将已修改的数据文件刷新到磁盘文件,同时保证数据库发生异常的情况下InnoDB能恢复到正常运行状态。
- InnoDB存储引擎后台线程7个——4个I/O thread,一个master thread,1个lock监控线程,一个错误监控线程。
- InnoDB存储引擎是在一个称做master thread线程上几乎实现了所有功能。
- 4 个I/O线程分别是insert buffer thread、log thread、read thread、微软贴thread。
5、内存
- InnoDB存储引擎由以下几个部分组成:缓冲池、重做日志缓冲池以及额外的内存池。
- 缓冲池中占最大块内存的部门,用来存放各种数据的缓冲。因为InnoDB的存储引擎的工作方式总是将数据库文件按页读取到缓冲池,然后LRU保留缓冲池中的数据。
- 数据库文件需要修改,总是首先修改在缓存池中的页(脏页),然后按一定的频率将缓冲池的脏页刷新到文件。
- 缓存的数据页类型有:索引页、数据页、undo页、插入缓存、自适应哈希、InnoDB存储的锁信息、数据字典信息。
- 日志缓存将重做日志信息先放入这个缓冲区,然后按一定频率将其刷新到重做日志文件。
6、master thread
- master thread的线程优先级别最高,其内部由几个循环(loop)组成:主循环、后台循环、刷新循环、暂停循环。
7、插入缓存
- 插入聚集索引一般是顺序的,不需要磁盘随机读取。
- 对于非聚集索引的插入或者更新操作,不是每一次直接插入索引页中,而是先判断出入的非聚集索引页是否在缓冲池中,如果在则直接插入,如果不在,则先放入一个插入缓冲区中,然后再按一定的频率执行插入缓冲和非聚集索引页子节点的合并操作。
8、两次写
如果说插入缓冲带给InnoDB存储引擎的是性能,那么两次写带给InnoDB存储引擎的是数据库的可靠性。
- 如果这个页本身以及损坏,在对其进行重做是没有意义的。也就是说,在应用重做日志前,我们需要一个页的副本,当写入实现发生时,先通过页的副本来还原该页,再进行重做。------doublewrite
9、自适应哈希索引
- InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称为自适应的。
- 自适应哈希索引通过缓冲池的B+树构建而来,因此建立的速度很快。而且不需要将整个表都建立哈希,InnoDB存储会自动根据访问的频率和模式为某些页建立哈希索引。
10、启动、关闭和恢复
- innodb_fast_shutdown 影响这表的行为;该参数可以取为0、1、2。
- 0:代表MySQL关闭的时候,需要完成所有的full purge和merge insert buffer操作,这会需要一定的时间。
- 1:是默认值,表示不需要完成所有的full purge 和merge insert buffer操作,但是缓冲池的一些数据脏页还是会刷新到磁盘。
- 2:只是将日志写入日志文件中,这样不会由任何事务丢失,但是MySQL数据库下次启动时会执行恢复操作。
11、日志文件
- 错误日志文件:对MySQL 的启动、运行、关闭过程进行了记录。该文件不但记录了出错信息,也记录一些警告信息或者正确的信息。
- 慢查询日志:可以设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。
- 查询日志:记录所有对MySQL数据库请求的信息,无论这些请求是否得到正确的执行。
- 二进制日志:记录对数据库执行更改的所有操作
- 恢复:某些数据库的恢复需要二进制日志,如当一个数据全备文件恢复后,我们可以通过二进制日志进行point-in-time的恢复。
- 复制:原理于恢复类似;进行实时同步。
12、重做日志文件
主要目的:
- 如数据库由于所在主机掉电导致实例失败,InnoDB会使用重做日志恢复到掉电前的时刻,以此保证数据的完整性。
- 重做日志大小设置对于MySQL数据库各方面还是有影响的。一方面不能设置的太大,如果设置很大,在恢复时可能需要很长的时间;另一方面又不能太小,否则可能导致一个事务的日志需要多次切换重做日志文件。
- 重做日志记录的时关于每个页的更改的物理情况。
13、B+树
- B+树索引不能找到一个给定键值的具体行。B+树索引只能找到的只是被查找数据的所在的页。然后数据库通过把页插入内存,再在内存中进行查找,最后得到查找的数据。
- 平衡二叉树对于查询速度的确很快,但是维护一个平衡二叉树的代价是非常大的,通常需要1次或多次左旋和右旋来得到插入或者更新后树的平衡性。适用于内存结构对象中,因此维护的开销相对较小。
- 聚集索引的存储并不是物理上的连续,相反是逻辑上的连续;页是通过双向链表连接,页按照主键的顺序排列,每个页的记录也是通过双向链表进行维护的,物理存储同样不按照主键存储。
- 如果要查找主键某以范围内的数据,通过叶节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可。
- 对于索引的添加或者删除操作,MySQL数据库先创建一张新的临时表,然后把数据导入临时表,删除原表,再把临时表重命名为原理的表名。
14、InnoDB行锁
- Record Lock:单个行记录上的锁
- Gap Lock:间隙锁,锁定一个范围,但不包括记录本身
- Next- Key Lock:Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身。
15、事务
- 原子性:原子性是指整个数据库事务时不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,才算整个事务成功。如果事务中的任何一个SQL语句执行失败,那么已经执行成功的SQL语句页必须撤销,数据库应该回退到执行事务前的状态。
- 一致性:一致性是指数据库从一种状态转变为下一种一致的状态。在事务开始之前和事务结束以后,数据吗完整性约束没有被破坏。
- 隔离性:一个事务的影响在该事务提交前对其他事务都不可见-----通过锁来实现
- 持久性:事务一旦提交,其结果就是永久性,即使发生宕机等故障,数据库也能将数据恢复。
16、备份与恢复
- 在MySQL数据库中,逻辑备份是指文件内容是可读的,通常是文本文件,内容一般是SQL语句,或者是表内的实际数据。这类方法的好处是可以看到导出文件的内容,一般适用于shujuk的升级、迁移等工作,但是恢复所需要的时间较长。
- 物理备份是指拷贝数据库的物理文件,数据库即可以是运行状态的(xtrabackup),也可以是停止状态的。这类备份的恢复时间往往较逻辑备份短很多。
- xtrabackup 工具增量备份的原理------只需要记录当前每个页最后的检查点LSN。如果大于之前完全备份时的LSN,则备份该页,否则不备份,这大大加快了备份的速度和缩短了恢复时间。