目录
一、sql关键字的执行顺序
from、where、select、group by_having 、order by 、limit
二、Mysql
- Mysql主要分为Server层和引擎层
- server主要包括连接器、查询缓存、分析器、优化器、执行器等,还有一个binlog(日志模块,用于整个数据库操作记录)
- 存储引擎层主要负责数据的存储和读取
1、连接器
- 客户端想要对数据库进行操作时,连接器就是用来负责跟客户端建立连接、获取权限、维持和管理连接的。
- 连接器支持短连接也支持长连接,为了避免频繁创建和销毁连接造成性能损失,可选择利用连接池进程管理,如druid,c3p0等
2、查询缓存
- 用来执行我们所执行的select语句以及该语句的结果集。如果开启了查询缓存,执行查询语句的时候,会先查询缓存,如果缓存中有,就会将缓存的结果直接返回给可会断。
- 但是当表中的数据频繁变动的时候,不推荐使用。因为当一张表的数据要是发生变化,所有的缓存都将清空
3、分析器
- 分析器主要是对要执行的sql语句进行解析,sql引擎会把语句转换成一个抽象的语法树
- 词法分析
提取关键字,比如select,提出要查询的表,提出字段名,提出要查询的条件等
- 语法分析
把提出的关键字转换为抽象的语法树后进行检验。
- 去判断你的sql是否正确,是否符合mysql的语法
4、优化器
- 根据执行该条sql语句可能会用到的方案,然后选择一条Mysql认为的效率最高的方式,并生成执行计划。比如一张表创建了多个索引,优化器会根据io和cpu成本,选择最优索引执行
5、执行器
- 根据执行计划完成sql语句的操作,执行前会去验证用户有没有权限。如果没有权限就会返回错误信息。如果有权限,就回去调用引擎接口,返回执行结果
三、可以将SQL语句执行分为两种种情况
1、查询语句
select * from student where ssex='男' and classid=1;
- 先去检查语句是否有权限,如果没有权限,就会返回错误信息,如果有权限,就会西安查缓存查询,如果这条sql语句为key在缓存中查询有结果,则返回。
- 通过分析器进行词法分析,提取sql语句的关键元素。比如上面的语句是select,提取关键字,表名student,条件ssex=男,classid=1.
- 然后去判断sql语句是否有语法错误,提取的关键字是否有错误。没有就执行下一步
- 优化器确定优化方案:查询是男的学生;查询班级编号为1 的学生
- 优化器会根据自己的判断去选择一个自己认为最好的方案去执行
- 进行权限验证
2、增删改
update student set ssex='女' where classid=1
- 先去查询一般这个数据,如果有缓存的话也是会用到缓存
- 然后拿到查询的语句,把性别改为女,然后去调用引擎api接口,写入修改的数据,存储引擎innodb把数据保存在内存中,写入日志中,告诉执行器执行
- 执行器执行,提交事务