mysql优化1

时间:2022-03-01 03:40:41

1. Mysql架构与sql执行流程【上】

讲师:青山

时长:1h5min

计划:2020/1/19 11:30 – 12:00

 

1.1. MySQL的发展历史

 mysql优化1

2000年MySQL开源,就出现很多分支。

MariaDB【oracle收购后,】,

Percona Server---XtraDB Engine

1.1.1.MYSQL的拼读

MySQL-----【My Ess Que Ell 】----注意:写法-----大小写【简历---体现专业性】

 mysql优化1

 

 

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

 

 

MySQL里面使用的半双工通信方式:

》要么客户端------向服务端发送数据

》要么服务端------向客户端响应数据

1.2.2.MySQL服务端参数

 

1.2.1.1.连接参数

一个连接保持多长时间没有使用,会关闭它?

(1).超时时间【8个小时】

wait_timeout【等待超时时间】,如:jdbc程序

interactive_timeout【交互式超时时间】如:数据库连接工具

 mysql优化1

 

 

show GLOBAL VARIABLES like ‘wait_timeout‘;

show GLOBAL VARIABLES like ‘interactive_timeout‘;

 

(2).连接数量

show global status like ‘Thread%‘;

 mysql优化1

 

 

说明:

       当客户端建立一个连接后,服务端是通过线程Thread来进行处理的。

 

Show processlist;

 mysql优化1

 

 

(3).最大连接数

show VARIABLES like ‘max_connections‘;

 mysql优化1

 

 

Mysql5.5官方默认值为100

Mysql5.7官方默认值为151,如下所示:

 mysql优化1

 

 

说明:

       它的最大值可以设置为2^14 = 16384。

       并不是连接数设置越大,性能越好。

 

       系统参数有两种级别:session和global,当不写明时,默认session

 

 

(4).一次发送数据的最大长度

       当超过这个最大值时,可能会报错。所以,避免不带limit的查询操作

show VARIABLES like ‘max_allowed_packet‘;

 

MySQL5.7官方默认值为4MB:

 mysql优化1

 

 

MySQL5.5默认值为1MB,如下所示:

mysql优化1

 

 

 

(5).MySQL查询缓存开关

show VARIABLES like ‘query_cache%‘;

 mysql优化1

 

 

而MySQL5.5版本是打开的,MySQL5.5是关闭的。

为什么会关闭它呢?说明MySQL官方不推荐使用,为什么呢?

 

因为查询缓存的生效条件要求很严格,很多情况会导致缓存失效:

》sql语句必须完全一样【甚至空格也不能多或少】

》一张表只要有一条数据发生变化【更新】,所有数据缓存会失效

 

所以,在mysql8.0.0版本中查询缓存模块已经被移除掉了。

(6)查询优化器监控开关

 

show VARIABLES like ‘optimizer_trace%‘;

 mysql优化1

 

 

修改值:

       Set optimizer_trace = ‘enabled=on’   //开启监控

注意:

       这个查询优化器是MySQL5.7以后才有的,5.5版本是没有的。

(7)查看数据库下所有表的存储引擎

show table status from dsg_dmsdb;

 mysql优化1

 

 

 

(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…

》语法解析

       经过解析后,解析过程构成一个解析树,如下所示:

 mysql优化1

 

 

       服务端sql的执行有很多的执行路径,执行方式,这些执行方式是怎么得到的呢?我们又是如何了解的呢?

      

       它们由预处理器来完成。

 

       当得到这些执行路径后,又应该选择哪一条执行?如何选择【判断标准是什么?】

这部分功能,由优化器Optimizer来处理。最后得到一个执行计划Execution Plan

 

       优化:sql开销小,就选择哪一种。

 

如何查询一条sql语句的开销情况:

show status like ‘Last_query_cost‘;

 mysql优化1

 

 

 

 

关于优化器的书籍推荐:

       《数据库查询优化器的艺术-原理解析》

 

      

查询优化器监控情况:

Select * from information_schema.optimizer_traceG  

说明:

       执行前提,必须要开启监控开关.

       返回json。分析如下:

 mysql优化1

 

 

 

 

4.数据存储

       经过优化后,生成执行计划,plan是在哪里执行?由谁来执行?

 

       逻辑上,数据是存储在Table表结构中的,可以理解为excel表格。

 

       在存储数据时,还需要组织数据的存储结构。这个结构是由什么决定的呢?

它是由存储引擎来决定的。

 

       Mysql中有多种存储引擎,它们是可以相互替换。

       表新建完成后,存储引擎是可以修改的。

 

       在服务端数据的存储目录查看:

 mysql优化1