MySQL进阶 一
Mysql高级进阶
Mysql架构
数据库
:按照数据结构来组织、存储和管理数据的仓库,通常由数据库管理系统进行管理
数据库管理软件(RDBMS)
:就是我们说的数据库管理系统软件,他强调软件
数据库实例
:启动数据库软件,在内存中运行一个独立进程,用来操作数据,这个正在运行的进程就是一个数据库实例,理论上可以在一台电脑上启动多个数据库实例,当然要监听在不同的端口
图片来源于网络
MySQL向外提供的交互接口(Connectors)
Connectors组件,是MySQL向外提供的交互组件,如java,.net,php等语言可以通过该组件来操作SQL语句,实现与SQL的交互。通过客户端/服务器通信协议与MySQL建立连接。MySQL 客户端与服务端的通信方式是 “ 半双工 ”。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么
管理服务组件和工具组件(Management Service & Utilities)
提供MySQL的各项服务组件和管理工具,如备份(Backup),恢复(Recovery),安全管理(Security)等功能
连接池组件(Connection Pool)
负责监听客户端向MySQL Server端的各种请求,接收请求,转发请求到目标模块。每个成功连接MySQL Server的客户请求都会被创建或分配一个线程,该线程负责客户端与MySQL Server端的通信,接收客户端发送的命令,传递服务端的结果信息等。
SQL接口组件(SQL Interface)
接收用户SQL命令,如DML,DDL和存储过程等,并将最终结果返回给用户
查询分析器组件(Parser)
首先分析SQL命令语法的合法性,并进行抽象语法树解析,如果sql有语法错误,会抛出异常信息。
优化器组件(Optimizer)
对SQL命令按照标准流程进行优化分析,mysql会按照它认为的最优方式进行优化,选用成本最小的执行计划。
缓存主件(Caches & Buffers)
缓存和缓冲组件,这里边的内容我们后边会详细的讲解。
MySQL存储引擎
MySQL属于关系型数据库,而关系型数据库的存储是以表的形式进行的,对于表的创建,数据的存储,检索,更新等都是由MySQL存储引擎完成的。
MySQL存储引擎在MySQL中扮演着重要角色。MySQL的存储引擎种类比较多,如MyIsam存储引擎,InnoDB存储引擎和Memory存储引擎
因为mysql本身就是开源的,他允许第三方基于MySQL骨架,开发适合自己业务需求的存储引擎。从MySQL存储引擎种类上来说,可以分为官方存储引擎和第三方存储引擎,比较常用的存储引擎包括InnoDB存储引擎,MyIsam存储引擎和Momery存储引擎。
Mysql查询流程
MySQL8.0取消了查询缓存
MySQL会对每条接收到的SELECT类型的查询进行hash计算,然后查找这个查询的缓存结果是否存在。hash计算和查找所带来的开销需要重视
查询语句的字符大小写、空格或者注释的不同,Query Cache都会认为是不同的查询,因为他们的hash值会不同
当向某个表写入数据的时候,必须将和这个表相关的所有缓存设置为失效,如果缓存内容很多,则消耗也会很大。
MySQLbin目录结构
MySQL服务器端工具
mysqld
:SQL后台保护程序(MySQL服务器进程)。该程序必须运行之后。客户端才能通过连接服务器端程序访问和操作数据库
mysqld_safe
:MySQL服务脚本。mysql_safe增加了一些安全特性,如当出现错误时重启服务器,向错误日志文件写入运行时间信息
mysql.server
:MySQL服务启动服本。调用mysqld_safe来启动MySQL服务
mysql_multi
:服务器启动脚本,可以启动或停止系统上安装的多个服务
myiasmchk
:用来描述、检查、优化和维护MyISAM表的实用工具
mysqlbu
:MySQL缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告
mysql_install_db
:用于默认权限创建MySQ授权表。通常只是在系统上首次安装MySQL时执行一次
MySQL客户端工具
mysql
:交互式输入SQL语句或从文件以批处理模式执行SQL语句来操作数据库管理系统,就是我们的客户端
mysqldump
:将MySQL数据库转储到一个文件,可以用来备份数据库
mysqladmin
:用来检索版本、进程、以及服务器的状态信息
mysqlbinlog
:用于从二进制日志读取语句。在二进制日志文件中包含执行的语句,可用来帮助系统从崩溃中恢复
mysqlcheck
:检查、修复、分析以及优化表的表维护
mysqlhotcopy
:当服务器在运行时,快速备份MyISAM或ISAM表的工具
mysql import
:使用load data infile将文本文件导入相关表的客户程序
perror
:显示系统或MySQL错误代码含义的工具
myisampack
:压缩MyISAP表,产生更小的只读表
mysaqlaccess
:检查访问主机名、用户名和数据库组合的权限
mysql.sock
不是bin目录中的,是linux系统中的mysql文件,socket 即 Unix 域套接字文件,在类 unix 平台,客户端连接 MySQL 服务端的方式有两种,分别是 TCP/IP 方式与 socket 套接字文件方式。Unix 套接字文件连接的速度比 TCP/IP 快,但是只能连接到同一台计算机上的服务器使用。通过设置 socket 变量可配置套接字文件路径及名称,默认值为 /tmp/mysql.sock,如果mysql.sock文件误删的话,就需要重启mysql服务
mysql数据备份
1 | -- 备份一个表 |
mysql数据恢复
1 | mysql -u root -p 要还原到的数据库 < ~/dump.txt |
字符集和排序规则
查看字符编码
1 | show collation like '%utf8%'; |
后缀 | 英文 | 描述 |
---|---|---|
_ai | accent insensitive | 不区分重音(è,é,ê和ë) |
_as | accent sensitive | 区分重音 |
_ci | case insensitive | 不区分大小写 |
_cs | case sensitive | 区分大小写 |
_bin | binary | 以二进制的形式进行比较 |
utf8和utf8mb4的区别
utf8mb3(utf-8)
:使用1~3个字节表示字符,utf8默认就是utf8mb3
utf8mb4
:使用1~4个字节表示字符,他是utf8的超集,甚至可以存储很多,emoji表情,mysql8.0已经默认字符集设置为utf8mb4。
character_set_server
和collate_server
对全局的字符集和排序规则进行设置。这两个设置可以在配置文件中修改
mysql修改配置
查看全局配置变量
1 | show global variables like '%wait_timeout%'; |
修改配置变量
- 修改配置文件,然后重新启动
1 | # vi /etc/my.cnf |
- set方式
1 | set global wait_timeout=10000; |
设置当前会话
- 修改
1 | mysql> set wait_timeout=10000; |
- 查看
1 | mysql> select @@wait_timeout; |
内置数据库
mysql
:这个库很重要,他是mysql的核心数据库,负责存储数据库的用户、权限设置、关键字等mysql自己需要使用,控制和管理的信息
information_schema
:这个数据库维护了数据库其他表的一些描述性信息,也称为元数据。比如,当前有哪些表,哪些视图,哪些触发器,哪些列等
performation_schema
:这个数据库用来存储mysql服务器运行过程中的一些状态信息,是做性能监控的。比如最近执行了什么sql语句,内存使用情况等
sys
:结合information_schema和performation_schema的数据,能更方便的了解mysql服务器的性能信息。
数据存储
innodb数据存储
对于innodb而言,数据是存储在表空间内的,表空间是一个抽象的概念,他对应着硬盘上的一个或多个文件
表空间存储数据的单位是页
,每一页大概占用16k的空间
系统表空间
系统表空间包含了很多【公共数据】,比如InnoDB的数据字典,回滚信息、系统事物信息、二次写缓冲等,老版本的mysql表中的数据也会存储在系统表空间
系统表空间是一个共享的表空间因为它是被多个表共享的
该空间的数据文件通过参数【innodb_data_file_path】控制,默认值是ibdata1:12M:autoextend(文件名为ibdata1、12MB、自动扩展)
1 | -- 如果1代表开启,0代表关闭 |
独立表空间
独立表空间是默认开启的,在5.6.6以后,Innodb不在默认将各个表的数据存储在系统表空间
当中,而是会为每一个表建立一个独立表空间,innodb存储引擎的独立表空间为.ibd
文件
如果启用了innodb_file_per_table
参数,需要注意的是每张表的表空间内存放的只是数据
、索引
和插入缓冲Bitmap页
,其他数据如:回滚信息、系统事物信息、二次写缓冲(Double write buffer)等还是放在原来的系统表空间内,同时即使启用了innodb_file_per_table
参数,系统表空间还是会不断的增加其大小的
其他类型表空间
MyIsam没有表空间的概念,他会在目录中产生2个文件.MYD(数据文件)
、.MYI(索引文件)
三个文件,在5.7以前数据文件
和表信息文件
是分开的,相互独立的。会多一个.frm
文件,8.0之后进行了合并
组织结构
区(extent)
:每一个表空间保存了大量的页,为了更好的管理这些页面,Innodb提出了区
的概念,对于16k的页,连续64个页就是一个区,大概1M的空间,每一个表空间都是由若干个连续的区组成的,每256个区被划分为一组
段(Segment)
:分为索引段,数据段,回滚段等后边会将,段是为了区分不同的数据类型,相同的段存的数据类型是一致的。一个段包含256个区(256M大小)。
Row Format
第一个部分是一个非NULL【变长字段长度列表】。变长列的真实长度就保存在这个部分,他是按照列的顺序【逆序放置】的。当列的长度小于255字节,如(varchar(50)),用1字节表示;若大于255个字节(varchar(600)),用2个字节表示,这其实也就说明了为什么varchar的最大长度是65536
第二个部分是NULL标志位,他指示了当前行数据中哪些为null值,用一个bitmap表示。NULL值标志位也是逆序排列,占用空间按照字节数高位补零,如有九个字段可以为空(00000001 01010101)
第三部分为记录头信息,固定占用5个字节(40位)
第四部分就是实际存储的每个列的数据了,需要特别注意的是,NULL不占该部分任何数据,即NULL除了占有NULL标志位,实际存储不占有任何空间。Innodb存储变长列(VARCHAR, VARBINARY, BLOB, TEXT)的前768字节,剩下的部分存储在溢出页中。固定长度列,超过768字节的视为变长列。内部存储前768字节,20字节指针存储列的溢出页的地址,所以长度为768+20字节
举例
1 | create table test ( |
- 表空间二进制结构
1 | 03 02 01 00 00 00 10 00 |
1 | 03 02 01 // 变长字段长度列表,逆序,t4列长度为3,t2列长度为2,t1列长度为1 |
1 | 03 02 01 // 变长字段长度列表,逆序,t4列长度为3,t2列长度为2,t1列长度为1 |
1 | 03 01 // 变长字段长度列表,逆序,t4列长度为3,t1列长度为1 |
REDUNDANT
第一个部分保存了
字段长度偏移列表
,这个部分保存了该行数据所有列,包括隐藏列的长度偏移量,这个偏移列表是按照列的顺序逆序排列
第二个部分为记录头信息
record header
,Redundant行格式固定占用6个字节(48位)第三个部分就是实际存储的每个列的数据了
DYNAMIC
InnoDB Plugin引入了两种新的文件格式(file format,可以理解为新的页格式),对于以前支持的Compact和Redundant格式将其称为Antelope文件格式,新的文件格式称为Barracuda。Barracuda文件格式下拥有两种新的行记录格式Compressed和Dynamic两种
新的两种格式对于存放BLOB的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际的数据都存放在BLOB Page中,而之前的Compact和Redundant两种格式会存放768个前缀字节。mysql8.0默认此格式
正确的开始 微小的长进 然后持续 嘿 我是小博 带你一起看我目之所及的世界……
本文标题:MySQL进阶 一
发布时间:2022年12月01日 - 21:06
最后更新:2022年12月01日 - 21:08
原始链接:https://codexiaobo.github.io/posts/2619773061/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。