MySQL系列(6)--初识存储引擎InnoDB

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duanxiaobin2010/article/details/80657584

了解了MySQL的基础,包括启动,监听,语句分析,表对象之后。需要了解很重要的一块–存储引擎。首先从最流行,应用最广的InnoDB说起

MySQL配置文件中datadir目录下文件类型有如下几类:
这里写图片描述
分别介绍这几个分类
1、日志文件

1)error日志:记录启动、运行或停止MySQL服务器过程,以及MySQL运行过程中一些较为严重的错误信息
2)slow-log:开启后慢查询日志后,会生成xxx-slow.log的日志,记录SQL语句执行过程中超过慢查询的记录
3)general-log:配置了通用查询日志,MySQL将运行过程中的所有sql都记录在xxx.log的文件中。在搞QPS下,开启会影响系统的性能,一般会在跟踪调测性能的时候打开。在高QPS的情况下,文件会很大。
4)logbin二进制日志文件:开启了二进制日志后会存在多个二进制文件(如mysql-bin.xxxx), bin-log日志记录数据中发生的写入性操作(增删改),但不记录查询操作,语句以事件的方式保存,描述了数据的更改过程,此日志对发生灾难时数据恢复起到了极为重要的作用。

5)redo重做日志文件:ib_logfile0,ib_logfile1.支持事务性引擎的redo日志文件
redo日志默认情况下有两个文件,也即:ib_logfile0和ib_logfile1,如果在数据库启动的过程中没有这两个文件,系统会默认自动生成这两个文件。
默认情况下,ib_logfile0和ib_logfile1是两个独立的日志文件(可以配置的更多个ib_logfile文件),但是redo日志的写入在逻辑上对于ib_logfile0和ib_logfile1是连续的。
重做日志是MySQL事物处理的核心文件,事务处理的核心之一是一致性,也就是说要么全做,要么全不做。
MySQL事物操作是logwrite-ahead操作,也即先写日志(具体怎么写日志取决于innodb_flush_log_at_trx_commit的配置),相当于间接写盘操作。
目的是将对数据库具体的数据文件的分散随机写入(多个表的数据写入数据文件)转换成基于日志的顺序写入操作,而数据文件是异步写盘,
如果数据文件写盘异常,可以通过redo日志来“重做”,据此来提高事物性操作的效率。
redo日志空间的使用,在逻辑上相当于一个环形空间,redo日志不断向前推进写入记录,后台的定时执行的checkpoint将事务修改过尚未写盘的记录异步写入数据文件之后,日志空间可重用

  这里写图片描述
2、系统数据库
1)mysql

存储了系统的用户权限信息及帮助信息,新建的用户,用户的权限信息的都存储在MySQL库。比如在修改MySQL的root密码的时候,都要先use mysql这个系统库,然后再执行用户,授权等操作。

2)performance_schema

是数据库性能相关的信息的数据,记录的是数据库服务器的性能参数。
1)保留进程等待信息,包括锁,互斥变量,文件信息等。
2)保存历史事件汇总信息,为MySQL服务器性能评估提供参考信息
3)配置型选项,来决定是否记录一些与性能相关的信息,比如profile信息等,参考http://www.cnblogs.com/wy123/p/6979499.html

3)information_schema

数据库的元数据信息(Metadata),是数据库的数据,比如数据库的名字,数据库中的表名,字段名,字段类型等,可以说是数据库的数据字典信息。
这个库中的信息并非物理地保存在表中,而是动态地去读取其他文件得到的,比如上面一开始提到的共享表空间,对于用户数据中的对象,比如表结构等,都保存在共享表空间中,因此在datadir目录下不会生成information_schema文件夹。

4)sys

可以根据sys库中的数据快速了解系统的运行信息,方便地查询出来数据库的信息,在性能瓶颈,自动化吧运维等方面都有很大的帮助,sys库中的信息是通过视图的方式,将information_schema和performance_schema库中的数据结合起来,可以得到更加直观和容易理解的信息

3、用户数据库
对于innodb引擎的表,一个表分别对应两个文件,一个是.frm,存储的是表结构信息,一个是.ibd,存储的是表中的数据,从大小也可以看出来.ibd较大而.frm较小。另外一个文件是db.opt,保存的是数据库的配置信息,比如编码信息等
对于innodb表,如果是独立的表空间的话,数据库中的表结构以及数据都存储在数据库的路径下(而不是在共享表空间中ibdata1文件中)
  但是数据中的其他对象,包括undo信息,也即数据被修改之后,事务提交之间的版本信息,仍然存储在共享表空间的ibdata1文件中

1)共享表空间:ibdata1,如果指定innodb表为非独立文件的,用户自定义库中的表的数据就存储在共享表空间中。即便是innnodb表指定为独立表空间,用户自定义库中的某些元数据信息(比如存储过程等信息都存储在共享表空间中)。 对于innodb,innodb_file_per_table选项决定了是否启动独立表空间,MySQL5.7中是默认启动的,也就是说MySQL的用户数据库将使用独立表空间来存储数据,

这里写图片描述
正如截图看到的,本测试服务器的共享表空间中只有一个文件,如下通过show variables like ‘innodb_data%’;命令可以查询共享表空间的文件信息,实际上共享表空间可以配置成多个物理文件
这里写图片描述

2)临时表空间:ibtemp1,存储临时对象的空间,比如临时表对象等
临时表空间是存储全局级,回话级,事物级,检索级临时表对象的地方,有参数innodb_temp_data_file_path可以看到临时表空间的信息。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/duanxiaobin2010/article/details/80657584