查询数据库流程&&SQL语句执行顺序

一 查询数据库流程

在这里插入图片描述
红色数字代表的意义与执行流程见下:
第一步:客户端通过连接器建立连接,发起查询请求“1”;
第二步:数据库服务向下执行“3”,检查数据库语法;
第三步:查询分析器向下执行“4”,优化查询代码(比如SQL语句执行顺序(见下)
第四步:查询优化器向下执行“5”,交给缓存管理器,并通过“7”查询缓存;
@如果缓存中有数据则直接通过“7”,返回数据,并经由缓存管理器 直接返回到 数据库服务端(上图中这条线忘记画了。。。),通过“2”返回客户端。
@缓存中没有数据则通过“8”查询数据库,并将查询到的数据保留一份,通过“6”缓存到数据库缓存中(数据库缓存并没有常见缓存器高效)并经由缓存管理器 直接返回到 数据库服务端(上图中这条线忘记画了。。。),通过“2”返回客户端。

二 SQL语句执行顺序

写的顺序select … from… where… group by… having… order by… limit [offset,]
一般简单的SQL基本为先select 再函数 再from 表名 再where 再分组 再排序 再分页
(rows)
执行顺序from… where…group by… having… select … order by… limit
下面是查询处理的每一个阶段:

FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1

ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。

JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为止。

WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。

GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.

CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.

HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。

SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。

DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.

ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.

LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

三 SQL数据库零散知识(参考)

查看MySQL当前有多少个连接

show global status like 'Thread%';  -- 查看连接数
	+-------------------+-------+
	| Variable_name     | Value |
	+-------------------+-------+
	| Threads_cached    | 0     |
	| Threads_connected | 8     |
	| Threads_created   | 8     |
	| Threads_running   | 1     |
	+-------------------+-------+

Threads_cached: 缓存中的线程连接数;
Threads_connected: 当前打开的连接数;
Threads_created: 为处理连接创建的线程数;
Threads_running: 非睡眠状态的连接数,通常指并发连接数;
每产生一个连接或者一个会话,在服务端就会创建一个线程来处理。反过来,如果要杀死会话,就是Kill线程。

查看当前连接的状态

mysql> show processlist;  -- root用户,查看连接状态
+----+------+-----------------+-------------+---------+------+-------+------------------+
| Id | User | Host            | db          | Command | Time | State | Info             |
+----+------+-----------------+-------------+---------+------+-------+------------------+
|  1 | root | localhost:4699  | NULL        | Sleep   | 8555 |       | NULL             |
|  2 | root | localhost:4701  | learn       | Sleep   | 2924 |       | NULL             |
|  3 | root | localhost:4704  | learn       | Sleep   | 2695 |       | NULL             |
|  5 | root | localhost:13878 | lizhi       | Sleep   | 2918 |       | NULL             |
|  6 | root | localhost:13879 | auditpro3.0 | Sleep   | 2892 |       | NULL             |
|  7 | root | localhost:14560 | learn       | Query   |    0 | init  | show processlist |
|  8 | root | localhost:14624 | shen_mall   | Sleep   |  353 |       | NULL             |
|  9 | root | localhost:14625 | shen_mall   | Sleep   |  353 |       | NULL             |
+----+------+-----------------+-------------+---------+------+-------+------------------+

状态详情:
Sleep --线程正在等待客户端,以向它发送一个新语句
Query --线程正在执行查询或往客户端发送数据
Locked --该查询被其它查询锁定
Copying to tmp table on disk --临时结果集合大于 tmp_table_size。线程把临时表从存储器内部格式改变为磁盘模式,以节约存储器
Sendig data --线程正在为 SELECT 语句处理行,同时正在向客户端发送数据
Sorting for group --线程正在进行分类,以满足 GROUP BY 要求
Sorting for order --线程正在进行分类,以满足 ORDER BY 要求

通信类型:同步 or 异步

同步通信的特点:
1、同步通信依赖于被调用方,受限于被调用方的性能。也就是说,
应用操作数据库,线程会阻塞,等待数据库的返回。
2、一般只能做到一对一,很难做到一对多的通信。

异步通信:
1、异步可以避免应用阻塞等待,但是不能节省SQL执行的时间。
2、如果异步存在并发,每一个SQL的执行都要单独建立一个连接,避免数据混乱。
但是这样会给服务端带来巨大的压力(一个连接就会创建一个线程,线程间切换回占用大量CPU资源)。
另外异步通信还带来了编码的复杂度,所以一般不建议使用。
如果要异步,必须使用连接池,排队从连接池中获取连接而不是创还能新的连接。

连接方式:长连接 or 短连接

短连接就是操作完毕以后,马上close掉。长连接可以保持打开,减少频繁创建、销毁带来的资源开销,后面的程序访问的时候还可以使用这个连接。一般我们会在连接池中使用长连接。 保持长连接会消耗内存,长时间不活动的连接,MySQL服务器会断开。

-- 查看mysql不同连接类型超时时间
	show global variables;
	show global variables like 'wait_timeout';   -- 非交互式超时时间,如JDBC程序
	show global variables like 'interactive_timeout';  -- 交互式超时时间,如数据库工具
	+---------------+-------+
	| Variable_name | Value |
	+---------------+-------+
	| wait_timeout  | 28800 |
	+---------------+-------+
	-- 默认都是 28800 秒,8 小时。

MySQL最大连接数

在5.7版本默认是151个,最大可以设置程2^14(16384)。

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
mysql show的参数说明
  1、级别: 全局global级别、会话session级别,不指明默认session;
  2、动态修改: set,重启后失效;永久生效,修改配置文件 /etc/my.cnf

查看配置的不同参数: show global/session variables like 'paramName111'; 
修改配置的不同参数(重启后会重置): set global/session paramName=value ;

e.g 
mysql> show global variables; -- 查看全局参数
mysql> set global max_connections=888;  -- 设置最大连接数

通信方式:单工//半双工//全双工

单工 : 数据单向传输,数据遥控器; 遥控器;
半双工 : 数据双向传输,但不能同时传输;对讲机;
全双工 : 数据双向传输,可以同时传输;打电话
在这里插入图片描述

数据库自带缓存模块

常见mariadb、mysql等都具有自带缓存,查看调用等代码见下:

检查“查询缓存”状态:

MariaDB [(none)]> SHOW VARIABLES LIKE 'have_query_cache';
------------------ -------
| Variable_name    | Value |
------------------ -------
| have_query_cache | YES   |
------------------ -------
1 row in set (0.00 sec)

查看缓存容量:

MariaDB [(none)]> SHOW VARIABLES LIKE 'query_cache_limit';
------------------- ---------
| Variable_name     | Value   |
------------------- ---------
| query_cache_limit | 1048576 |
------------------- ---------
1 row in set (0.00 sec)
SHOW VARIABLES LIKE 'query_cache_min_res_unit';
-------------------------- -------
| Variable_name            | Value |
-------------------------- -------
| query_cache_min_res_unit | 4096  |
-------------------------- -------
1 row in set (0.00 sec)

清除查询缓存

MariaDB [(none)]> RESET QUERY CACHE;
Query OK, 0 rows affected (0.00 sec)

点击查看: SpringCloud系列.
关于linux系统软件的安装、配置等可以参考公众号:胜科课堂
在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值