热门标签 | 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,这样就不会有问题了。

推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 本文详细探讨了不同SQL数据库管理系统(DBMS)在限制输出结果、拼接字段和日期时间处理方面的函数差异。通过具体示例,帮助读者理解并掌握如何在不同DBMS中实现相同功能。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • Navicat Premium 15 安装指南及数据库连接配置
    本文详细介绍 Navicat Premium 15 的安装步骤及其对多种数据库(如 MySQL 和 Oracle)的支持,帮助用户顺利完成软件的安装与激活。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
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社区 版权所有