《MySQL运维内参》节选 | InnoDB数据字典(上)

网友投稿 716 2022-10-04

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

《MySQL运维内参》节选 | InnoDB数据字典(上)

《MySQL运维内参》导读

作者签名预售活动 | 预售进行中,五一左右发货关于《MySQL运维内参》的内容 《MySQL运维内参》前言 | 周彦伟 《MySQL运维内参》前言 | 王竹峰 《MySQL运维内参》节选 | Binlog中的时间戳(上)《MySQL运维内参》节选 | Binlog中的时间戳(下)《MySQL运维内参》推荐序 | 甘泉 《MySQL运维内参》推荐序 | 王瀚漓

相关背景

说到数据字典,这是任何一个通用型关系数据库所必备的,它是用来存储元数据信息的表,属于系统表。所有针对对象的操作,都会使用到系统表,对于了解知名大型通用数据库(Oracle或SQL Server等)的同学而言,数据字典是很明确的,可以看到的。从中可以轻易得知目前数据库中有哪些对象、对象之间的关系等,也可以直接去查这些表来获取最新的元数据信息,非常方便,甚至有很多Oracle动态视图就是通过直接对数据字典的查询来实现的。但是这些同学在接触到MySQL之后,发现这一切都改变了。第一次用的时候,可能就是想看看数据字典表的信息,但找遍了所有能找的地方,都没有找到相关的信息,给人的感觉就是MySQL是一个黑盒子。

当然,在了解MySQL数据库的同学看来,这不是很容易么?如果想看表结构,直接show create table tablename;就好了,想看到所有列的信息,直接使用show full columns from tablename;就可以了,应有尽有啊!但其他同学还是想看到数据字典的表,看到之后才踏实,那么这个时候,了解MySQL的同学可能就会说:“那这个确实没有,只能这样”。

但是,对于一个有兴趣学习MySQL,想深入了解其设计原理及架构的同学而言,能看到数据字典是一件非常重要的事情。在MySQL中,可以说看不到、不支持这个功能,但不能说没有这个功能。看不到是有原因的,原因就是MySQL是一个插件式的数据库管理系统。

有数据字典的好处是,用户可以很明确简单地了解MySQL元数据管理的实现原理,比如创建一个表时,对哪些字典表有影响、影响是什么、在内部是如何管理的等。如果看不到这些,可能很多人就会有疑惑。InnoDB是如何管理这些元数据的,难道只有.frm文件?这个二进制文件的完整性如何保证?但实际上,这些是由看不到的系统表来保证的。.frm文件,对于InnoDB来说只是一个为了与MySQL兼容的附属品而已。如果从一开始就能了解到这节所要讲的内容,在学习及使用InnoDB时,就能少走一些弯路。

在InnoDB中,系统表实际上是看不到的,不像Oracle那样可以方便地通过一个查询语句就能得到其中的内容。原因就是,MySQL是一个插件式的数据库管理系统。它的结构分两层,分别是Server层和存储引擎层,这两层需要相互配合才能一起友好地工作。但是,作为一个插件式的数据库管理系统,存储引擎层可以有多个存储引擎的插件,但Server层只有一个。这样的话,很明显,只能是存储引擎层来配合Server层了。因为一些历史原因导致每个存储引擎的实现程度并不相同,而且不同的存储引擎具有不同的功能,其各自的运用场景也不一样,这就使得存储引擎能实现的一些高级功能,在Server层会有不同体现,而Server层一般做不到对存储引擎区别对待,所以只能是一视同仁。

最早的默认存储引擎为MyISAM,它是没有数据字典的,关于表结构,它所拥有的只有.frm文件,所以这导致了InnoDB也必须要有这个文件才能使得Server层识别并管理它。对于Server层来说,一个表是什么存储引擎,这是表的属性。具体深入到每一个存储引擎内部,数据字典表就不能被Server层来管理了,因为它是存储表的表,这就导致InnoDB的数据字典不能被用户感知了。想要了解这些知识,只能通过源代码,或者手册简单了解一下。

未完待续,接下来会介绍Innodb数据字典系统表结构、字典表加载、RowID管理等原理。

上一篇:kubernetes v1.17.x 二进制安装文档
下一篇:SQL注入的几种形式和理解(2)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~