客户端:大多数基于网络的C/S架构都有客户端的角色
server层:大多数MySQL的核心服务功能都在这一层,包括查询解析,分析,优化,缓存,以及所有的内置函数(日期,时间,数学函数,加密函数等)以及所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等
存储引擎层:负责mysql中数据的存储和提取,和文件系统一样,存储引擎不会解析SQL,而且也不同存储引擎之间不能通信
关于sever层介绍:
连接器:维持,管理连接,权限验证,建立连接,选择是TCP/SOCKE连接,基本命令和参数
注意点:
-
一个用户一旦登陆,即使后台修改他的权限,也不会立即生效,除非断开重连
-
可以通过show processlist 查看当前连接的用户
-
最大连接时长由wait_timeout控制,默认8小时
-
建议定期断开长连接,少使用过多的短连接,如果版本>5.7,执行mysql_reset_connection可以重新初始化连接资源,不要重新做权限验证
1.mysql -u root -p -S /tmp/mysql.sock
2.mysql -uroot -p -h 10.0.0.51 -P 3306 # 远程登录
3.mysql -u root -p -e "show database" # 在bash窗口操作数据库,不会进入数据库命令行
# 常用参数如下
-u 用户
-p 密码
-S
-h IP地址
-P 端口
-e 不进入数据库 在shell中执行交互命令(一般用户脚本操作)
< 回收数据用的 mysql -u root -p wulinlin < word.sql (免交互执行sql文件)
查询缓存:
MySQL数据库拿到查询请求后,会优先查找查询缓存,如果之前执行过这条查询语句,其结果会以k-v格式保存在内存中,k:查询语句,v:查询结果,一旦命中查询缓存,直接返回结果
但是一般情况下不建议使用查询缓存:
-
查询缓存的失效特别频繁,只要表有更新,所有查询缓存全部清空,除非是静态表
-
mysql8.0版本后直接放弃了查询缓存
-
可以将query_cache_type设置成DEMAND,那么默认sql语句是不走查询缓存的
分析器:
词法分析
分析SQL语句是多少个字符串和多少个空格组成,需要识别出里面的字符串代表的是什么
语法分析
根据语法规则,判断输入的SQL语句是否合法,一般所有的语法错误都是这一层给的提示
优化器:执行计划生成,索引选择
创建解析树,对sql进行各种优化,重写查询,表的读取(连接)顺序,以及索引的选择
执行器:操作引擎,返回结果
判断是否有执行权限
根据引擎的定义使用引擎提供的接口,执行SQL语句
那么如果查询一个存在的表,报错是在哪一个环节呢?
select * from T where sname = "微信";
报错提示:unkonwn column 'sname' in 'where clause'
# 答案:分析器