云原生俱乐部-mysql知识点归纳(1)
本来想在写mysql之前先把shell写完的,但是当我看到shell中的函数和变量的时候,我想还是等等再写吧,因为不太熟,这样子写很煎熬。至于mysql的话,更多的则是理论,很多知识点都需要记住的,大部分时候都会问到。
这个章节主要讲讲理解MySQL体系结构以及配置MySQL两部分内容,在前半部分,主要讲的是mysql如何处理、存储和传输数据,并且会描述数据字典,mysql如何使用内存等,后半部分则是关于mysql服务器的配置文件。
理解MySQL体系结构
mysql的需要安装服务端和客户端,两者可以分开按需安装。mysql服务端进程(mysqld)有个连接层会处理客户端的连接,它实质上是一个多线程的单进程服务,管理对磁盘和内存中的数据库访问。
[1]mysqld服务进程
前面说到,mysqld进程有连接层,其实还有SQL层和存储层,属于三层架构体系。在连接层中,会处理和客户端的通信协议,如tcp socket或者本地unix socket。
默认选项是-h localhost,使用本地unix socket,这种方式的效率比较高,因为数据不用加密,也不会发送到网络上传输,因此也不会经过防火墙,不过选项-h 127.0.0.1则是通过tcp socket访问。
接着是SQL层,SQL层的内容包括解析SQL语句,验证连接的用户是否有足够的权限执行语句,并且会为每个查询语句创建最佳执行计划。SQL层还会记录查询日志,用于审计分析。
最后是存储层,InnoDB是默认的存储引擎,并且推荐使用。存储层执行实际的数据操作,通过访问存储介质并执行解析后的SQL语句。
[2]数据库的定义
InnoDB引擎基于磁盘,支持外键约束和事务,并且支持行级锁定;MEMORY引擎则是基于内存,数据在服务器重启后不可用。那么mysql的数据(基于InnoDB)究竟放在哪里呢?答案是/var/lib/mysql目录中。
每个数据库都会在该目录有个目录,用于存储特定的数据文件,如.ibd文件,包含表数据和元数据。元数据包括列定义,索引定义等,用于定义数据的结构、属性、关系和约束条件。
在数据库中,元数据相当于系统的“蓝图”,记录所有数据库对象的定义信息,数据字典则是包含所有元数据的档案资料库。
表空间是 MySQL 中存储表数据和索引的物理文件,是数据库中的逻辑存储单元(如test库),对应磁盘上的一个或多个文件(如.ibd文件)。系统表空间默认名为ibdata1,存储数据字典和缓冲区。
配置MySQL
配置文件是描述mysqld服务是怎么运行的,包括数据目录,日志目录的位置,系统变量值等等。
[1]设置加载的配置文件
在linux系统中,默认的配置文件是/etc/my.cnf,家目录的~/.mf.cnf优先级也更高。可以通过--defaults-file在mysqld运行时从指定的配置文件中获取配置,通过--datadir=指定数据目录。
当然这个配置文件还可以定义客户端如何运行,编辑mf.cnf文件的[mysql]选项组,可以约束mysql客户端登录的行为,甚至可以将账号密码写上去。也可以使用mysql_config_editor来设置账号密码,默认保存在~/.mylogin.cnf文件中,并且使用cat查看乱码。
[2]查看和修改系统变量
系统变量主要包括全局和会话两种,使用show variables 来查看变量(默认是session,使用show global查看全局),使用set global来修改全局变量。不过这些都是动态修改的参数,随mysqld重启而丢失。
使用set persist则是永久修改,会记录到配置文件中,同时可以用reset persist动态撤销修改。`mysqld-auto.cnf`是 MySQL 8.0+ 引入的动态持久化配置文件,用于存储通过 `SET PERSIST`或 `SET PERSIST_ONLY`命令修改的全局变量。