没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Mysql架构与内部模块
演示环境:
MySQL 5.7
存储引擎:InnoDB
一、一条查询SQL是如何执行的?
程序或者工具要操作数据库,第一步跟数据库建立连接。
1、通信协议
首先,MySQL 必须要运行一个服务,监听默认的端口(3306)。
通信协议
MySQL 支持多种通信协议。
第一个就是 TCP/IP 协议,编程语言的连接模块都是用 TCP 协议连接到 MySQL 服务器的,比如 mysql-
connector-java-x.x.xx.jar。
第二种是 Unix Socket。比如我们在 Linux 服务器,不用通过网络协议,也可以连接到 MySQL 的服
务器,它需要用到服务器上的一个物理文件(mysql.sock)。
mysql -uroot -p123456
show variables like 'socket';
另外还有命名管道(Named Pipes)和内存共享(Share Memory)的方式。
连接方式
第三个是连接这一块。
MySQL 既支持短连接,也支持长连接。短连接就是操作完毕以后,马上 close 掉。长连接可以保持
打开,后面的程序访问的时候还可以使用这个连接。
长时间不活动的连接,MySQL 服务器会断开。
默认是 28800 秒,8 小时。
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_interactive_timeo
ut
MySQL 默认的最大连接数是 151 个(5.7 版本),最大是 16384(2^14)。
show variables like 'max_connections';
查看 3306 端口当前连接数
使用 SHOW FULL PROCESSLIST;查看查询的执行状态。
一些常见的状态:
show global variables like 'wait_timeout'; (非交互式超时时间,如 JDBC 程序)
show global variables like 'interactive_timeout'; (交互式超时时间,如数据库工具)
netstat -an|grep 3306|wc -l
状态 含义
Sleep 线程正在等待客户端,以向它发送一个新语句
Query 线程正在执行查询或往客户端发送数据
Locked 该查询被其它查询锁定
Copying to tmp
table
临时结果集合大于 tmp_table_size。线程把临时表从存储器内部格式改变为磁
盘模式,以节约存储器
Sending data 线程正在为 SELECT 语句处理行,同时正在向客户端发送数据
Sorting for
group
线程正在进行分类,以满足 GROUP BY 要求
Sorting for
order
线程正在进行分类,以满足 ORDER BY 要求
2、查询缓存(Query Cache)
MySQL 内部自带了一个缓存模块。默认是关闭的。主要是因为 MySQL 自带的缓存的应用场景有
限,第一个是它要求 SQL 语句必须一模一样。第二个是表里面任何一条数据发生变化的时候,这张表所
有缓存都会失效。
在 MySQL 5.8 中,查询缓存已经被移除了。
3、语法解析和预处理(Parser & Preprocessor)
下一步我们要做什么呢?
假如随便执行一个字符串 fkdljasklf ,服务器报了一个 1064 的错:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'fkdljasklf' at line 1
服务器是怎么知道我输入的内容是错误的?
或者,当我输入了一个语法完全正确的 SQL,但是表名不存在,它是怎么发现的?
这个就是 MySQL 的 Parser 解析器和 Preprocessor 预处理模块。
这一步主要做的事情是对 SQL 语句进行词法和语法分析和语义的解析。
词法解析
词法分析就是把一个完整的 SQL 语句打碎成一个个的单词。
比如一个简单的 SQL 语句:
select name from user where id = 1;
它会打碎成 8 个符号,记录每个符号是什么类型,从哪里开始到哪里结束。
语法解析
第二步就是语法分析,语法分析会对 SQL 做一些语法检查,比如单引号有没有闭合,然后根据 MySQL
定义的语法规则,根据 SQL 语句生成一个数据结构。这个数据结构我们把它叫做解析树。
预处理器(Preprocessor)
如果表名错误,会在预处理器处理时报错。
它会检查生成的解析树,解决解析器无法解析的语义。比如,它会检查表和列名是否存在,检查名
字和别名,保证没有歧义。
4、查询优化(Query Optimizer)与查询执行计划
什么优化器?
问题:一条 SQL 语句是不是只有一种执行方式?或者说数据库最终执行的 SQL 是不是就是我们发
送
的 SQL?
这个答案是否定的。一条 SQL 语句是可以有很多种执行方式的。但是如果有这么多种执行方式,这
些执行方式怎么得到的?最终选择哪一种去执行?根据什么判断标准去选择?
这个就是 MySQL 的查询优化器的模块(Optimizer)。
查询优化器的目的就是根据解析树生成不同的执行计划,然后选择一种最优的执行计划,MySQL 里
面使用的是基于开销(cost)的优化器,那种执行计划开销最小,就用哪种。
使用如下命令查看查询的开销:
show status like 'Last_query_cost';
--代表需要随机读取几个 4K 的数据页才能完成查找。
剩余53页未读,继续阅读
资源评论
谷雨之际
- 粉丝: 477
- 资源: 158
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功