1. Mysql架构与sql执行流程【上】
讲师:青山
时长:1h5min
计划:2020/1/19 11:30 – 12:00
1.1. MySQL的发展历史
2000年MySQL开源,就出现很多分支。
MariaDB【oracle收购后,】,
Percona Server---XtraDB Engine
1.1.1.MYSQL的拼读
MySQL-----【My Ess Que Ell 】----注意:写法-----大小写【简历---体现专业性】
1.1.2.Mysql的官网
https://dev.mysql.com/doc/5.7/en/
1.2.SQL执行流程
一条查询语句是如何执行的?
Select * from user_innodb where name = ‘青山’;
1.2.1.客户端连接服务端
1.2.1.1.通信类型
同步/异步
1.2.1.2.连接方式
长连接/短连接
MySQL支持两种方式:
短连接:当一个sql执行完毕,会立即close这个连接。
长连接:保持连接多次使用,不需要频繁地关闭、打开连接。一个连接可被多个客户端复用。
一般在数据库连接池中使用。它对服务端的影响【消耗内存】
1.2.1.3.通信协议
》unix Socket
>TCP/IP
连接时,-h参数来体现
》Named Pipes
>Share Memory
后面两种,需要在安装勾选才会有效
1.2.1.4.通信方式
MySQL里面使用的半双工通信方式:
》要么客户端------向服务端发送数据
》要么服务端------向客户端响应数据
1.2.2.MySQL服务端参数
1.2.1.1.连接参数
一个连接保持多长时间没有使用,会关闭它?
(1).超时时间【8个小时】
wait_timeout【等待超时时间】,如:jdbc程序
interactive_timeout【交互式超时时间】如:数据库连接工具
show GLOBAL VARIABLES like ‘wait_timeout‘;
show GLOBAL VARIABLES like ‘interactive_timeout‘;
(2).连接数量
show global status like ‘Thread%‘;
说明:
当客户端建立一个连接后,服务端是通过线程Thread来进行处理的。
Show processlist;
(3).最大连接数
show VARIABLES like ‘max_connections‘;
Mysql5.5官方默认值为100
Mysql5.7官方默认值为151,如下所示:
说明:
它的最大值可以设置为2^14 = 16384。
并不是连接数设置越大,性能越好。
系统参数有两种级别:session和global,当不写明时,默认session
(4).一次发送数据的最大长度
当超过这个最大值时,可能会报错。所以,避免不带limit的查询操作
show VARIABLES like ‘max_allowed_packet‘;
MySQL5.7官方默认值为4MB:
MySQL5.5默认值为1MB,如下所示:
(5).MySQL查询缓存开关
show VARIABLES like ‘query_cache%‘;
而MySQL5.5版本是打开的,MySQL5.5是关闭的。
为什么会关闭它呢?说明MySQL官方不推荐使用,为什么呢?
因为查询缓存的生效条件要求很严格,很多情况会导致缓存失效:
》sql语句必须完全一样【甚至空格也不能多或少】
》一张表只要有一条数据发生变化【更新】,所有数据缓存会失效
所以,在mysql8.0.0版本中查询缓存模块已经被移除掉了。
(6)查询优化器监控开关
show VARIABLES like ‘optimizer_trace%‘;
修改值:
Set optimizer_trace = ‘enabled=on’ //开启监控
注意:
这个查询优化器是MySQL5.7以后才有的,5.5版本是没有的。
(7)查看数据库下所有表的存储引擎
show table status from dsg_dmsdb;
(8) 服务端数据的存储目录查看
1.2.2.2.参数设置
A.永久设置
通过修改配置文件。
Vi /etc/my.cnf
B.动态修改
使用set命令
1.2.3.MySQL的sql执行流程
1.客户端和服务端建立连接
2.服务端缓存数据
MySQL默认查询缓存的开关是关闭的。
3.解析器模块-----校验sql语句
当我们输入一条不符合sql语句的sql后,点击执行,会报错
》词法解析
把sql拆分成一个个的关键字,select ,*,from…
》语法解析
经过解析后,解析过程构成一个解析树,如下所示:
服务端sql的执行有很多的执行路径,执行方式,这些执行方式是怎么得到的呢?我们又是如何了解的呢?
它们由预处理器来完成。
当得到这些执行路径后,又应该选择哪一条执行?如何选择【判断标准是什么?】
这部分功能,由优化器Optimizer来处理。最后得到一个执行计划Execution Plan
优化:sql开销小,就选择哪一种。
如何查询一条sql语句的开销情况:
show status like ‘Last_query_cost‘;
关于优化器的书籍推荐:
《数据库查询优化器的艺术-原理解析》
查询优化器监控情况:
Select * from information_schema.optimizer_traceG
说明:
执行前提,必须要开启监控开关.
返回json。分析如下:
4.数据存储
经过优化后,生成执行计划,plan是在哪里执行?由谁来执行?
逻辑上,数据是存储在Table表结构中的,可以理解为excel表格。
在存储数据时,还需要组织数据的存储结构。这个结构是由什么决定的呢?
它是由存储引擎来决定的。
Mysql中有多种存储引擎,它们是可以相互替换。
表新建完成后,存储引擎是可以修改的。
在服务端数据的存储目录查看: