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的编写。