热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

读书笔记--InnoDB数据字典

在InnoDB中,系统表实际上是看不到的,不像Oracle那样可以方便地通过一个查询语句就能得到其中的内容。因为MySQL是一个插件式的数据库管理系统。它的结构分为两层,分别是Server层和存
在InnoDB中,系统表实际上是看不到的,不像Oracle那样可以方便地通过一个查询语句就能得到其中的内容。因为MySQL是一个插件式的数据库管理系统。它的结构分为两层,分别是Server层和存储引擎层。最早的存储引擎是MyISAM,它是没有数据字典的,关于表结构,它拥有的只有.frm文件,所以这导致了InnoDB也必须要有这个文件才使得Server层识别并管理它。对于Server层,一个表是什么存储引擎,这是表的属性。具体深入到每一个存储引擎内部,数据字典就不被Server层来管理了,这就导致数据字典不能被用户感知了。

系统表结构
InnoDB有四个最基本的系统表,用来存储用户定义的表,列,索引及索引列等信息,这些表分别为SYS_TABLES,SYS_COLUMNS,SYS_INDEXES,SYS_FIELDS。

SYS_TABLES
用来存储所有InnoDB为存储引擎的表
NAME:表示一个表的表名
ID:表示这个表的ID号
N_COLS:表示这个表的列的个数,建表指定的列数。
TYPE:表示这个表的存储类型,包括记录的格式,压缩等信息。
SPACE:表示这个表所在表空间ID号。这个表对应的主键列为NAME,同时还有一个在ID号上的唯一索引。

SYS_COLUMNS
用来存储InnoDB中定义的所有表中所有列的信息,每一列对应这个表的一条记录。
TABLE_ID:表示这个列所属的表的ID号
POS:表示这个列在表中是第几列。
NAME:表示这个列名。
MTYPE:表示这个列的主数据类型。
PRTYPE:表示这个列的一些精确数据类型,它是一个组合值,包括NULL标志,是否有符号数的标志,是否是二进制字符串的标志及表示这个列是真的varchar
LEN:表示这个列数据的精度,目前没有用到。

SYS_INDEXES
用来存储InnoDB中所有表的索引信息,每一条记录对应一个索引
TABLE_ID:表示这个索引所属的表的ID号。
ID:表示这个索引的索引ID号
NAME:表示这个索引的索引名
N_FIELDS:表示这个索引包括的列个数。
TYPE:表示这个索引的类型,包括聚簇索引,唯一索引,等
SPACE:表示这个索引数据所在的表空间ID号
PAGE_NO:表示这个索引对应的B+树根页面。


SYS_FIEDS
用来存储所有索引中定义的索引列,每一条记录对应一个索引列。
INDEX_ID:这个列所在的索引
POS:这个列在某个索引中是第几个索引列
COL_NAME:这个索引列的列名。


字典表的加载
InnoDB启动的时候,如果是新建数据库,则需要初始化库,索引需要创建字典管理的B+树信息。因为InnoDB中的系统表的结构,个数等都是固定的,所以在初始化库的时候只需要创建这几个表的存储B+树即可。同时把将这几个B+树的根页号存储在一个固定位置,就不需要将这几个表自身的信息存储在系统表中了。对于一个B树,只要找到其根页面,就可以找检索其数据了。
对于数据字典表根页面位置的存储方式,InnoDB用了一个专门的页面(0号表空间0号文件的7号页面)来管理数据字典信息。这个页面用来存储4个系统表的五个根页面号(有5个索引)。
普通用户表的加载过程,当用户访问一个表时,系统首先会从表对象缓冲池中查找这个表SHARE对象,如果找到,则直接从其实例化表对象空间链表中拿一个空闲的实例化的表对象使用,如果没有一个可用的实例化对象,则需要重新打开(实例化这个表),在实例化这个表的时候,需要找到这个表的字典信息,包括这个表本身,列信息及索引信息等,这些信息很多都是从SHARE对象处获得。如果没有SHARE对象,则需要从系统表中构造SHARE对象。

Rowid管理
在InnoDB中,用户表中的记录不一定都会有一个Rowid列,Rowid只有在一个表没有定义主键时,才会分配。而Rowid的管理分配,并不是一个表独享一个ID空间,而是全局的,使用表都共享这个ID号。
Rowid的分配并不会直接修改页面,只要这个值为256的倍数的时候才会写入一次。那么如果插入200次,这些值还没有被写入,这是系统重新启动,ID号岂不是重复使用,因为数据库启动的时候会调用函数做一个工作,就是将上次写入的Rowid值向上对齐256后在加上256,这样就不会有问题了。

推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了一个误删Oracle数据文件导致数据库无法打开的问题,并提供了解决方式。解决方式包括切换到mount状态、离线删除报错的数据文件等。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • soatest新建db工具,执行sql语句的步骤和注意事项
    本文介绍了在soatest中新建db工具并执行sql语句的步骤和注意事项,包括设置数据库连接参数、使用配置文件的方法编写sql查询语句、增加oracle驱动连接jar包、运行测试用例以及查看查询结果。详细说明了每个步骤的操作和相关注意事项。 ... [详细]
  • Linux下安装依赖包版本高解决方法
    本文介绍了在Linux系统下,当已安装的依赖包版本高于需要安装的依赖包版本时,解决方法包括欺骗安装程序和修改相关配置文件等操作。针对不同情况,提供了不同的解决方案。 ... [详细]
author-avatar
刘旭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有