游戏开发

MySQL进阶知识(一)--系统库

2021-09-14  本文已影响0人  higher2017

本系列文章主要是本人在游戏服务端开发过程中,遇到的一些不那么为人熟知但我又觉得比较重要的MySQL知识的介绍。希望里面浅薄的文字能为了提供一点点的帮助。

本文个人在掘金首发(https://juejin.cn/editor/drafts/6996322071986831368),现在同步到简书社区。

MySQL系统自带的库

当你安装完MySQL(我安装的是8.0.17版本),你会发现里面就会有几个不是我们自己创建的库:

image.png

information_schema、mysql、sys、performance_schema(不同的版本还可能有test,不过没什么实际作用这里不做讨论)。这些库都是MySQL自带的库,我不止一次听别人说不要对这里面的东西进行改动。好奇心驱使我探究一下它们到底有是什么作用。下面我一个一个来介绍它们:

information_schema库

从库的名字来看,这个库应该是保存一些数据库基本信息的库。实际上它并没有保存这些信息,只是对一些信息提供一个访问的入口。你在information_schema库中看到的表都不是真正的表而是视图。你只能select查询这些表的数据,而无法修改或者插入这个库中任意表的数据。这也就是使用Navicat直接打开这些表的时候会报“Field 'Create Table' not found”。


information_schema的表列表.png

被访问的信息主要是MySQL服务器所维护的所有其他数据库元数据。这些元数据有:数据库的名、数据库的表、访问权限、数据库表的数据类型、数据库索引的信息等等(官方文档)。这里举其中比较重要的表说明一下:

使用SELECT ... FROM INFORMATION_SCHEMA语句从information_schema库查询数据库基本信息,也可以通过SHOW语句来查询。前者是后者的一种替代方式,比如:引擎列表查询:SHOW ENGINESSELECT * FROM INFORMATION_SCHEMA.ENGINES等价; 插件查询:SHOW PLUGINSSELECT * FROM INFORMATION_SCHEMA.PLUGINS等价;

mysql库

mysql库作为系统的自带库,该库中的表主要存储的是服务器运行时所需要的数据,包括:数据库字典(字符集、表、列、索引等相关信息)、权限设置(用户、表和字段的权限、代理 权限)、日志系统信息、时区等mysql自己需要使用的控制和管理信息(官方文档)。

image.png
这里列举一些关键的表进行说明: image.png

performance_schema库:

从库的名字来看,这个库应该是保存一些数据库运行时性能相关的数据。实时上该库也确实用于给用户查询服务器运行期间性能相关的信息,包括:服务器函数调用、等待操作系统、SQL 语句执行阶段(例如解析或排序)、同步调用(例如互斥锁)文件、表 I/O、表锁等信息。performance_schema库中的数据不会持久磁盘到磁盘的,只会在内存表中存在。内容在服务器启动时重新填充,并在服务器关闭时丢弃。其存储引擎使用的是PERFORMANCE_SCHEMA引擎(performance_schema库:官方文档)。

image.png
下面挑几个有代表的表做介绍,从这些表你大概能看出该库大概有什么作用:

sys库:

从这个库的名字来看像是保存MySQL一些系统配置类信息,实际上它主要是为了方便开发人员或者DBA对performance_schema库收集的服务器性能信息进行查询(将performance_schema里面的信息汇总转化成更直观更容易理解的形式来展示)。这个库里面主要是通过视图的方式来进行数据的查询和更直观的展示(只有sys_config才是真正的会存数据的表),这些视图的源数据表就是来自于performance_schema库。它的功能有:生成性能诊断报告、查询性能架构配置等等(官方文档)。注意只有5.6或以上的MySQL版本才会有该库。如果你不想要也可以把它删掉,是的你删了它也没什么关系。

image.png

这里介绍几个比较常见和重要的视图:

一般线上MySQL服务器是不会对开发人员开放这几个库的权限。很多配置上的问题(比如权限、连接数、慢查询标准等)运维或者DBA就帮开发人员弄好了。要查一些系统信息也是通过运维和DBA帮助查询。确实开发人员不知道这些表有什么用也不影响写代码,但是了解这几个表能很好帮助我们认识MySQL的一些基本运行规则,比如数据库的权限体系可以怎么划分、MySQL服务器性能怎么样、死锁时要怎么排查、MySQL服务器压测怎么才算过关等等。

总结

深入了解过这些库之后,我发现平时自己忽略的东西其实是如此重要。了解这些库所包含的内容有助于我们了解数据库的监控体系、权限控制等等,并且在出现问题的时候知道怎么通过这些库去定位问题。

上一篇下一篇

猜你喜欢

热点阅读