MySQL进阶一(执行计划)

1.一条查询sql语句是如何执行的?

select * from user where name='mmj'

1.1 建立连接

首先要开启服务端的监听,默认监听3306端口
通信协议:MySQL支持多种通信协议,可以使用同步/异步的方式,支持长连接/短连接,这里我们拆分来看,首先是通信类型。

1.1.1 通信类型:同步/异步
  • 同步通信的特点
    1.同步通信依赖于被调用方,受限于被调用方的性能,应用操作数据库,线程会阻塞,等待数据库的返回。
  • 异步通信的特点:
    1.应用可以避免应用阻塞等待,但是不会节省sql的执行时间,并且会增加编码的复杂度。
    一般来说,我们都是使用同步方式。
1.1.2 连接方式:长连接或者短连接

MySQL支持长连接和短连接,短连接就是用完马上close掉,长连接可以保持打开,减少服务端创建和释放连接的消耗,一般我们是在连接池中使用长连接。
保持长连接会消耗内存。长时间不活动的连接,MySQL服务器会自动断开,我们可以通过show命令查看线程的存活时间:
show global variables like '%wait_timeout%';--非交互式超时时间,如 JDBC 程序
show global variables like '%interactive_timeout%'--交互式超时时间,如数据库工具
默认都是28800,8小时
我们还可以使用show status命令查看当前有多少连接
show global status like '%Thread%';

  • Threads_cached:缓存中的线程数,mysql管理的线程池中还有多少可以被复用的资源。
  • Threads_connected:当前打开的连接数。
  • Threads_created:总共已创建的线程数。
  • Threads_running:正在运行的线程数

MySQL服务允许的最大连接数是多少呢?
在5.7版本中默认是151个,最大可以设置成16384(2^14)。
show variables like '%max_connections%';
show的参数说明:
 1.级别:会话(session)级别(默认);全局(global)级别;
 2.动态修改:set,重启后失效;永久生效,修改配置文件/etc/my.cnf
举个例子:set global max_connections=200;

1.1.3 通信协议

第一种是unix socket,它需要用到服务器上的一个物理文件(/var/lib/mysql/mysql.sock)。
第二种是TCP/IP协议,我们在应用中使用的都是用这种。
mysql -h192.168.150.11 -uroot -p123456

1.1.4 通信方式

我们先了解下通信方式有哪几种:



MySQL使用的是半双工的通信方式,所以客户端与服务端发送数据都是一次性发送的,因此我们要注意一次性不能发送太大的sql语句,也不能一次性读取太大的数据,默认是4M大小,可以通过max_allowed_packet查看并修改

1.2:查询缓存

MySQL的缓存是必须一摸一样的sql语句,并且当相关的表有更新操作时缓存会失效,因此很鸡肋,MySQL默认缓存时关闭的,在MySQL8.0中,缓存模块已经移除。

1.3:语法解析与预处理(parser&preprocessor)
1.3.1.词法解析

就是将sql拆成一个个单词

1.3.2.语法解析

第二步就是语法分析,语法分析会对sql做一些语法检查,比如单引号,括号是否闭合这种,然后根据MySQL定义的语法规则,根据SQL生成一个数据结构。就是解析树:


1.3.3预处理器

检查表名是否存在,字段是否存在,是否存在歧义等。

1.4查询优化器与选择执行计划

查询优化器就是根据解析树生成不同的执行计划(一种数据结构),然后选择一种最优的执行计划,MySQL里面使用的时基于花销(cost)的优化器,哪种开销最小就使用哪种,但是优化器不是万能的,因此我们要注意SQL的编写。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容