1.Mysql简介
mysql是一种关系型数据库,由表结构来存储数据与数据之间的关系,同时为sql(结构化查询语句)来进行数据操作。
sql语句进行操作又分为几个重要的操作类型
DQL: Data Query Language 数据查询语句
DML: Data Manipulation Language 添加、删除、修改语句
DDL: Data definition Language 数据库结构操作
DCL:权限控制语句
TCL: 事务相关 比如commit/savepoint、rollback
对应关系数据库,就会有一个非关系型数据库,像redis这种key、value结构数据这种文档存储等等。redis可见博客Redis的数据类型及使用场景-CSDN博客
那么关系型数据库相比非关系型数据有什么区别呢?
a. 关系型数据都是用表来进行维护的,所以格式一致,可以统一用sql语言来进行操作
b.关系型数据都是表结构,所以灵活度不够,操作复杂的海量数据性能比较差,所以我们才会有表结构、索引以及索引优化
c.虽然性能可能会比较慢,但是能做复杂的关联查询操作,比如一对一、一对多、多对一等
思考:Mysql属于关系型数据库的一种,为什么都喜欢用Mysql呢?说句很实在的话,因为开源(不要钱)。那么我们来看看官网是什么吹的What Is MySQL? | Oracle
相比于其它的关系型数据库,Mysql主要由以下几个优势:(跟其它主流的基本上都差不多)
大话来说就是,好用,易上手,稳定可靠,性能好,可扩展高可用,又安全又灵活
易用性: 开发者可以在几分钟内安装好 MySQL ,数据库易于管理。可靠性: MySQL 是最成熟、使用最广泛的数据库之一。超过 25 年,它已经在各种场景中进行了测试,其中包括许多世界上最大的公司。由于MySQL 的可靠性,组织依赖 MySQL 来运行关键业务应用程序。可扩展性: MySQL 可扩展以满足最常访问的应用程序的需求。 MySQL 的本机复制架构使 Facebook 等组织能够扩展应用程序以支持数十亿用户。性能: MySQL HeatWave 比其他数据库服务更快且成本更低,多项标准行业基准测试证明了这一点,包括 TPC-H 、 TPC-DS 和 CH-benCHmark 。高可用性: MySQL 为高可用性和灾难恢复提供了一套完整的本机、完全集成的复制技术。对于关键业务应用程序,并满足服务级别协议承诺,客户可以实现 零数据丢失以及秒级的故障转移恢复。安全性: 数据安全需要保护和遵守行业和政府法规,包括欧盟通用数据保护条例、支付卡行业数据安全标准、健康保险可移植性和责任法案以及国防信息系统局的安全技术实施指南。MySQL 企业版提供高级安全功能,包括身份验证/ 授权、透明数据加密、审计、数据屏蔽和数据库防火墙。灵活性: MySQL 文档存储为用户开发传统 SQL 和 NoSQL 无模式数据库应用程序提供了最大的灵活性。开发人员可以在同一个数据库和应用程序中混合和匹配关系数据和 JSON 文档。
2.Mysql架构
我们知道,我们写的一条sql语句是从客户端发起,到服务端处理,再由服务端返回数据,那么它经历了哪些模块或流程呢?
在Mysql架构中,主要分为2大模块,一个是服务层,一个是存储引擎层。服务层就是Mysql这个数据库服务提供的一些功能,比如跟客户端连接,分析sql语句等等;而存储引擎层更多的是Mysql一个插件,来负责数据的存储和查询方式
2.1 服务层
Mysql服务层负责从客户端接收sql语句,然后对sql语句进行解析,看sql语句是否正确,是否有权限操作。然后分析出来怎么去查看更好,知道怎么查询了后就去调用存储引擎相关的接口实现,返回数据。服务层主要分为以下几个模块:
2.1.1连接器
首先,我们得连接客户端,那么Mysql里面就有一个连接层,我们来看下连接层相关的变量:
show status like 'Max_used_connections%'
max_used_connections:自服务启动以来最大的连接数
max_used_connections_time 达到这个峰值的时间
-- 最大的连接数,超过该值不允许建立连接,默认151,最小1 最大100000
select @@max_connections;
-- 查询超时时间,毫秒为单位
select @@max_execution_time;
set @@GLOBAL.max_connections=5; -- 设置最大线程数
set @@GLOBAL.max_execution_time=1000; -- 更改会话的查询超时时间为1S 更改后 对新起的会话生效
select * from t_work_order; -- 查询超过1s的数据会报错
连接器的参数有助于我们排查生产问题,比如我们的CPU超高,系统卡了,那么我们就可以查看一下当前用户正在运行的线程:
show full processlist;
字段解析:
user: 操作的用户名
host: 地址
db: 操作的db
command: 当前连接执行的命令 休眠 查询 sleep为空闲连接
time: 这个状态持续的时间;单位是s
state: 状态
info: 线程正在执行的语句,如果线程没有执行语句,则为NULL
如果遇到查询很慢,甚至由于IO阻塞导致了CPU消耗过高怎么解决?
-- 1.查看当前线程
show processlist;
-- 2. 关闭查询query
KILL query 2280; -- 终止上面查询时间过长的id
-- 3. 杀死连接 connection
KILL 2280;
2.1.2 解析器
当成功建立连接后,就开始解析sql语句,会把一条sql语句解析成一颗语法树,看是否符合我们的sql语法,主要分为词法解析和语法解析
词法解析:将 sql 语句打碎,转化成一个一个关键单词,然后交给语法解析器去构建语法树,判断语法是否正确语法解析: 语法解析已经知道每个 sql 语句的单词了,那么在语法解析的时候,会去检 查语法是否正确,比如, where 是不是写出 where1,from 写成from1.表名、列名是否存在、用户是否有操作权限等等
2.1.3 预处理
什么是预处理,预处理是对解析后的sql进行一定的前置处理,进行提效的。预处理主要有以下两个好处。
1.每次执行语句时解析语句的开销更少。通常,数据库应用程序处理大量几乎相同的语句,仅更改WHERE 查询和删除、 SET 更新和 VALUES 插入等子句中的文字或变量值。2.防止 SQL 注入攻击。参数值可以包含未转义的 SQL 引号和定界符。
2.1.4 优化器
根据上面的处理,我们已经知道了要执行一个什么样的语句,但是具体怎么执行也会有很多的方式,比如走哪个索引,语句是不是可以优化,做哪种优化,那种执行方式、路径更快呢?
Mysql提供了一些优化器可供选择,通过全局变量optimizer_switch来决定
select @@GLOBAL.optimizer_switch
优化器说明官网:MySQL :: MySQL 8.0 Reference Manual :: 10.9.3 Optimizer Hints
优化方式、优化器实践官网: MySQL :: MySQL 8.0 Reference Manual :: 10 Optimization
优化器会生成一个最终的执行计划,所以这个语句到底怎么走,优化器来决定。
2.1.5 执行器
根据相应的执行计划,去调用数据存储的地方,也就是来到了我们的存储层。执行器会去根据表设置的存储引擎,调用不同存储引擎的API接口获取数据。
至于这个数据怎么存的,这个数据有哪些优化(比如内存去缓存等),就是每个存储引擎自己去做的事情了。并且存储引擎和mysql是解耦的。
执行器的主要职责就是去查询数据,并且把查询结果组装返回,是Mysql与存储引擎的交互方。比如没有索引,就会去扫描全表的数据,一条一条判断是否满足条件。如果有索引,就会走索引树,减少扫描数量。
2.2 存储引擎层
存储层是数据真正存储的地方。Mysql支持不同的存储引擎,这些存储引擎决定了我们数据的存储方式,以及数据的可靠性、一致性、持久性、原子性。也就是我们经常讲的ACID。
有些存储引擎支持ACID,有些存储引擎不支持ACID,有些存储引擎为了性能,有些存储引擎是为了数据的一致性。
那么官网提供了哪些存储引擎: MySQL :: MySQL 8.0 Reference Manual :: 18 Alternative Storage Engines
如何查询当前服务器支持哪些存储引擎呢?
那么存储引擎之间有什么区别呢? 我们根据查出来的信息谈谈InnoDB与MyIASM的区别:
Innodb: 支持事务 ;行级锁 ;支持外键
Myiasm: 不支持事务;仅支持表级锁;不支持外键
有关索引的差异我们后面会提到