select * from user where id=10
当输入这条查询语句之后会发生什么?
MYSQL逻辑架构图
MYSQL大致可以分为两大部分:Server层和存储引擎层
下面来介绍各层中各部分的作用:
连接器:
客户端请求建立连接,在完成TCP连接之后,开始输入用户名,密码。
连接分为长连接和短连接,长连接一经建立,如果客户端一直有请求,那么连接就不断开。短连接执行很少的几次查询之后就断开连接。
因为建立连接过程比较复杂,所以长连接较为简便,但是因为SQL语句执行过程中临时使用的内存在连接对象里面,如果长连接积累下来,资源占用大,MYSQL占用的内存就会非常大。
当MYSQL占用的内存达到一定程度之后,MYSQL就被系统杀死,从现象看就是MYSQL重启了。
解决这个问题的办法:
1.定期断开长连接
2.初始化连接,将连接初始化,连接恢复到刚刚创建完的时候
查询缓存:
连接建立完成之后,MYSQL获得查询请求,先在缓存里查看,如果缓存中有这条语句,就获取他返回。
缓存中一般是(key,value)的格式,key是你所输入的SQL语句。value是SQL执行完成之后的结果
但是一般不建议用缓存,因为如果某个表有更新操作,那么关于这个表的所有缓存都要清空。
MSQL也很人性化的提供给用户自由使用缓存这个功能,可以先设置不适用缓存,需要使用的时候
使用select SQL_CACHE * from user where ID=10;
分析器:
缓存中查不到之后,开始进入分析器,先做词法分析,分析器获取到一些字符串与空格,即用户输入的SQL语句,识别出每个字符串代表什么,把select识别为select,把ID识别为列ID
之后开始语法分析,看是不是有语法错误,比如 输入 elect * from user where ID=10会报错
优化器:
分析器判断SQL语句无误后,进入优化器,,优化器来决定需要使用哪个索引,各个表的连接顺序
执行器:
优化器优化之后,执行器开始执行这个SQL语句,开始执行之前,先判断是不是有权限
如果用户没有对这个表的查询操作,就返回没有权限。
如果有权限,就去使用引擎提供的接口。
无索引访问:调用引擎接口取这个表的第一行,判断是不是符合ID=10,不是则跳过然后进入第二行,是则将结果保存在结果集中进入第二行。
有索引访问:调用索引中满足要求的第一行,满足要求的第二行
存储引擎:一般如果不指定存储引擎,则默认是InnoDB引擎