一、innodb初探:

1、MySQL日志文件:

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

②:error.log 文件会记录一些系统启动或运行时的错误或警告信息,通过配置参数log_error来设置;

③:general.log 文件会记录所有在数据库上执行的语句,经常用来追踪问题,但会影响一点性能,所以一般不会打开,只有在调试的时候会偶尔开启。(如果在QPS很高的情况下,这个文件可能会非常大不太好处理一般不建议打开)

2、MySQL系统的datadir目录下,有一个目录叫MySQL:

这个目录实际上是MySQL数据库的一些系统表,比如权限、用户等,但这些表都是MyISAM存储引擎的表;

3、默认的3个数据库实例:information_schema  performance_schema  sys

①:information_schema :

information_schema数据库是MySQL自带的,它是一个信息数据库,其中保存着关于MySQL服务器维护的所有其他数据库的信息,如数据库名、数据库表、表列的数据类型及访问权限等;在该数据库中有数个只读表,它们实际上是视图,而不是基本表;

②:performance_schema:

performance_schema数据库是在MySQL5.5新增的,命名为performance_schema,该数据库它是针对性能的,主要用于收集数据库服务器性能参数。该数据库有如下功能:

提供进程等待的详细信息,包括锁、互斥变量、文件信息;

保存历史事件汇总信息,为判断MySQL服务器性能做出详细的依据

添加或删除监控事件点都非常不容易,并可以随意改变MySQL服务器的监控周期;

③:sys:

sys数据库是MySQL5.7中首次加入的系统信息库,这个库类似Oracle中动态视图,通过这库可以快速的了解系统的元数据信息,并非常方便的让DBA发型数据库的很多信息,在解决性能瓶颈、自动化运维方面提供了巨大的帮助。该库在MySQL5.7中是默认的,在5.6可以手动导入;

注意:这个库是通过视图的形式把information_schema和performance_schema结合起来的,查询出让人更加容易理解的结果;但是前提是,sys库本身的信息来源要依赖information_schema;

4、innoDB存储引擎包括两个默认的日志文件,

日志文件大小通过参数innodb_log_file_size来设置,个数通过参数innodb_log_files_in_group来设置。这几个日志文件的大小被设置后在运行过程中是不能被改变的,如果要修改需要关闭数据库然后修改;

--注意:innodb存储引擎还有一个小文件,db.opt 这个文件存储的是MySQL数据库的一些配置信息,例如编码,排序的信息,如果在创建数据库时指定一些非默认的参数的话就会在这个文件中存储这些信息;

二、innodb数据字典:

1、在MySQL中是看不到数据字典的,原因就是MySQL是一个插件式的数据库管理系统,它的结构分两层,分别是server层和存储引擎层,这两层需要相互配合才能一起友好的工作,但是作为一个插件式的数据库管理系统,存储引擎层可以有多个存储引擎的插件,但server层只有一个;最早的默认存储引擎为MyISAM,它是没有数据字典的,关于表结构,它所拥有的只有.frm文件,所以这导致了innodb也必须要有这个文件才能使得server层识别并管理它;

2、innodb有4个最基本的系统表,

用来存储用户定义的表、列、索引及索引列等信息,这些表分别为:sys_tables  sys_columns  sys_indexes  sys_fields

①:sys_tables表:用来存储所有以innodb为存储引擎的表,每条记录对应已经定义的一个表;

name:表示一个表名

ID:表的ID号

N_COLSL :表示这个表的列的个数,建表指定的列数(4个字节)

type:表示这个表的存储类型,包括记录的格式、压缩等信息(4个字节)

space:表示这个表所在的表空间ID号;

(其中,mix_id  mix_len  cluster_name这三个位置暂时使用不到)

②:sys_columns:用来存储innodb中定义的所有表中所有列的信息,每一列对应这个表中的一条记录;

table_id :表示这个列所属的表的ID号;

pos :表示这个列在表中是第几列;

name :表示这个列的列名

mtype :表示这个列的主数据类型;

prtype :表示这个列的一些精确数据类型,它是一个组合值,包括null标志,是否有符号数的标志,是否是二进制字符串的标志及表示这个列是真的varchar;

len :表示这个列的数据长度,但不包括varchar类型,因为这个类型在记录里面存储了数据长度

prec :表示这个列数据的精度,但目前好像没有使用;

③:sys_indexes:用来存储innodb中所有表的索引信息,每条记录对应一个索引;

table_id :表示这个索引所属的表的ID号

ID :表示这个索引的索引ID号

name :表示这个索引的索引名;

n_fields :表示这个索引包含的列个数;

type :表示这个索引的类型,包括聚簇索引、唯一索引、等

space :表示这个索引数据所在表空间ID号;

page_no :表示这个索引对应的B+树的根页面;

④:sys_fields :用来存储所有索引中定义的索引列,每一条记录对应一个索引列

index_id :这个列所在的索引

pos :这个列在某个索引中是第几个索引列;

col_name :这个索引列的列名;

3、字典表加载:

在innodb启动的时候,如果是新建数据库,则需要初始化库,所以首先需要做的就是创建字典管理的B+树等信息,在这些初始化操作之后,就通过函数dict_boot加载常驻内存的四个系统表并读取一些其他信息;

4、rowid管理:

在innodb中,用户表中的记录不一定都会有一个rowid列,rowid只有在一个表没有定义主键时,也就是需要rowid作为聚簇索引列的时候才会被分配给这个表。而rowid的管理分配,并不是一个表独享一个ID空间,而是全局的,所有表都共享这个ID号;

三、innodb数据存储结构

1、表空间文件组成结构

innodb存储引擎在存储设计上模仿了Oracle的存储结构,其数据是按照表空间进行管理的。新建一个数据库时,innodb存储引擎会初始化一个名为ibdata1 的表空间文件,默认情况下,这个文件会存储所有表的数据,以及我们所熟知但看不到的系统表sys_tables、sys_columns、sys_indexes 、sys_fields等。此外,还会存储用来保证数据完整性的回滚段数据,当然这部分数据在新版本的MySQL中,已经可以通过参数来设置回滚段的存储位置了;

innodb存储引擎的设计很灵活,可以通过参数innodb_file_per_table来设置,使得每一个表都对应一个自己的独立表空间文件,而不是存储到公共的ibdata1文件中。独立的表空间文件之存储对应表的B+树数据、索引和插入缓冲等信息,其余信息还是存储在默认表空间中。

这个文件所存储的内容主要就是B+树(索引),一个表可以有多个索引,也就是在一个文件中,可以存储多个索引,而如果一个表没有索引的话,用来存储数据的被称为聚簇索引,也就是说这也是一个索引。最终的结论是,ibd文件存储的就是一个表的所有索引数据;

2、段:

段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。创建一个索引(B+树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B+树非叶子(页面)的数据,叶子段用来管理(存储)B+树叶子节点的数据;也就是说,在索引数据量一直增长的过程中,所有新的存储空间的申请,都是从“段”这个概念中申请的。一个索引,包括两个段,那么一个表的段的数目就是索引的个数乘以2了。(更形象的解释:ibd文件,就是由多个段组成的,没有任何其他空间是脱离了段的管理。)

3、簇:

innodb引入了簇的概念,在代码中被称为extent;

簇是构成段的基本元素,一个段由若干个簇构成。一个簇是物理上连续分配的一个段空间,每一个段至少会有一个簇,在创建一个段时会创建一个默认的簇。如果存储数据时,一个簇已经不足以放下更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是簇。簇的空间大小是固定的,一般是64个页面;(簇是实际的物理存储空间)

4、页面:

“页面”是簇细分之后的产物,它是簇的组成单位,也是段所管理的最小单位、数据文件管理的最小单位,当然也是文件中空间分配的最小单位。

一个簇中可以包括多个页面(默认为64个页面,每个页面是16KB),这个页面数通常被叫做“簇的大小”。这些页面都归这个簇管理,在逻辑上(页面号都是从小到大连续的)及物理上都是连续的。在向表中插入数据时,如果一个页面已经被写完,系统会从当前簇中分配一个新的空闲页面处理使用,如果当前簇中的64个页面都被分配完,系统会从当前页面所在段中分配一个新的簇,然后再从这个簇中分配一个新的页面来使用;(更简单的说:表空间文件就是被划分成相等长度的块,每一个块就是一个页面,一个页面默认为16KB,一个文件中没有任何空间是脱离了段的管理而存在的)

---注意:没有任何空间不是一页面的形式而存在的。

5、段、簇、页面组织结构:

一个表空间可以有多个文件,每个文件都有各自的编号,创建一个表空间时,至少有一个文件,这个文件被称为“0号文件”。一个文件是被切割为等长“默认16KB”的块,这个块通常被称为页面,那么在“0号文件”的第一个页面(page_no为0)中,存储了这个表空间中所有段簇也管理的入口,那么在这个页面存储的数据就是16KB,但通常会有页面头信息会占用一些空间,真正的管理信息数据是从页面偏移为fil_page_data(38)的位置开始的,这个位置存储了表空间的描述信息;

---注意:

①:表空间控制信息有:满簇链表、半满簇链表、空闲簇链表,而段的inode信息中也有这些信息;表空间中的链表管理的是整个表空间中所有的簇,包括满     簇、半满簇及空闲簇,而段的iNode信息中管理的是属于自己段中的满簇、半满簇及空闲簇。

②:在innodb中,一个簇描述页面要管理16384个页面,簇大小默认为(fsp_extent_size)64个,而簇描述符的大小为40B,所以一个簇描述页面中可以描述      的簇的个数为(univ_page_size-页面头长度)/40,其中univ_page_size=16384B表示页面大小;在一个表空间中,簇描述页面的存储是每隔16384个页      面就有一个簇描述页面,所以簇描述页面中只需要描述16384个页面即可;

③:所谓的btr,在innodb中,表示的就是B+树的处理,不管以它为开头的是函数,还是文件,都是相关的处理,是Btree的简称;

本文转自一个笨小孩51CTO博客,原文链接:http://blog.51cto.com/fengfeng688/1954429,如需转载请自行联系原作者

mysql 5.7 存储引擎_mysql5.7——innodb存储引擎总结-阿里云开发者社区相关推荐

  1. mysql unix_timestamp now() dfdfd f_数据库函数lpad的搜索结果-阿里云开发者社区

    我的MYSQL学习心得(六) 原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL ...

  2. mysql 5.1版本无innodb trx_MySQL 5.7: Innodb 事务子系统优化-阿里云开发者社区

    MySQL5.7 : Innodb 事务子系统优化 之前写了篇博客介绍了Percona Server对Read View的优化,顺带简单提到了MySQL5.7的事务子系统优化,详细见http://my ...

  3. lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区

    在刚过去的几个月中,我一直在构思并尝试在 redis 中实现 lua 脚本的事务功能.没有多少人理解我的想法,所以我将通过一些历史为大家做下解释. MySQL 与 Postgres 在 1998-20 ...

  4. mysql 字段类型设计_Mysql字段类型设计相关问题!-阿里云开发者社区

    Mysql是以文件存储在我们的系统的硬盘上面,那么 (1)当我们读取写入的时候就会有磁盘IO的问题 (2)当我们存储的数据是以页单位存储,而且每页的大小是16K,那么我们要尽可能的让我们的一页数据存放 ...

  5. python向mysql中添加数据_通过python操控MYSQL添加数据,并将数据添加到EXCEL中-阿里云开发者社区...

    第一步 在python中创建mysql数据表 import pymysql #导入模块 def getCon(): #联接到数据库,并封装循环使用,db是数据库名字 conn = pymysql.co ...

  6. mysql和jfinal的区别_mysql与JFinal的数据关系-阿里云开发者社区

    mysql与jfinal在使用过程中,一定要弄清楚数据关系,否则容易发生类型不匹配的错误. 一.关系整理 为此,我根据jfinal的源码和mysql的数据字段类型,整理列表如下: mysql jfin ...

  7. 阿里云mysql主从有延迟怎么办_MySQL主从数据库同步延迟问题解决-阿里云开发者社区...

    MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...

  8. mysql 查询速度不稳定_mysql严重查询速度的问题一则-阿里云开发者社区

    之前用mysql一直也没觉得有特别慢的感觉,最近发现新开发的系统有个页面打开速度非常慢,有时候1分钟都打不开.查了一下系统,定位到是一条sql语句执行慢造成的.该sql如下: SELECT COUNT ...

  9. mysql聚合函数要分组吗_mysql聚合函数和分组-阿里云开发者社区

    文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 一. 聚合函数 聚合 ...

  10. mysql sqlserver 函数_等价于MySQL中的SQLServer函数SCOPE_IDENTITY()??mysql-问答-阿里云开发者社区-阿里云...

    这是您要寻找的: LAST_INSERT_ID() 为了回应OP的评论,我创建了以下基准测试: CREATE TABLE Foo ( FooId INT AUTO_INCREMENT PRIMARY ...

最新文章

  1. CLR 基本概念理解
  2. linux shell which 和 whereis 区别
  3. CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)
  4. thinkphp中配置信息的二维数组设置与使用
  5. java 反射 类名_java – 从反射中获取字段的类名
  6. python多线程同步
  7. DataFrame的构建及一些操作
  8. LDA-math-MCMC 和 Gibbs Sampling (我爱NLP)
  9. 仿写王者荣耀主页代码HTML CSS,CSS3实现王者荣耀匹配人员加载页面的方法
  10. 微信公众号账号测试申请
  11. 2020.04 总结分享
  12. BN层的running_mean更新机制
  13. python天天向上的力量实验报告_Python练习11:天天向上的力量
  14. Java 线程池设计思想及源码实现
  15. PHP MySQL 连接数据库
  16. Library\PackageCache\com.unity Error (are you missing a using directive or an assembly reference?)
  17. 2017.7.10 noi2008 假面舞会
  18. Android 11.0 系统去掉多用户功能
  19. python语法(一)
  20. 天正服务器不显示,天正菜单无法显示怎么办?

热门文章

  1. lc滤波器是利用电感的感抗_电感器在电路中的应用特性
  2. 【XSY2470】lcm 数学
  3. docker-containerd 启动流程分析
  4. mkdir命令(转)
  5. 线性表的链式存储结构-----链表
  6. 某TS流视频文字识别系统
  7. redis数据类型之List
  8. POI动态下载Excel模板案例
  9. Nginx在Linux下的安装部署
  10. 方维P2P添加富友金账户接口实例