mysql
-
优化器
-
插拔式的存储引擎–》作用于表
sql执行的曲折
客户端 =》 连接器 =》 查询缓存 =》 有缓存 =》 返回客户端
=》 没有缓存 =》 分析器 =》 优化器 =》 执行器 =》 BinLog[归档日志] =》 存储引擎
以上可以分为两个部分:
server
层- 存储引擎层
首先来说[连接器],也就是我们每次使用mysql
的时候,我们需要输入 host IP username password 来做连接登录mysql
,我们做了这个之后,mysql
需要作出回应呀,看看有没有这个叫[什么鬼]的小伙子,再看看这个[什么鬼]小伙子有没有一系列的[特权]呀。。。就拿PHP
来说,在使用mysql
的时候,不管是
mysqli
还是PDO
,都需先去连接mysql
,同样的mysql
在这些连接后也需要作出回应,那么这个[守门的]就是 连接器。同时也需要注意:mysql
的
连接器,比如说我们当前的用户test
,它现在是一个屌丝,什么都没有,它连上了mysql
,但是之后,突然走了狗shi运。牛pi了。但是,它进去mysql
之后就没有
出来过,那么就相当于它还没有拿到特权,还是个屌丝。只有它重新离开再进去,它的特权才能生效。
- mysql 客户端和服务端通信
通信方式 【半双工–对讲机】【全双工–打电话】【单工–收音机】
mysql 是半双工
客户端一旦开始发送消息另一端要接受完整个消息才能响应
客户端一旦开始接受数据没法停下来发送指令
show processlist;/show full processlist;
sleep
query
locked
sorting result
线程正在
sending data
向请求端返回数据
再来说[缓存],mysql
的缓存默认是没有开启的,也就是要我们手动开启。
show variables like query_cache_type= 0关闭 | 1开启 | 2按需开启
它的缓存存储形式就是像key => value
这种形式,key
就是我们的查询语句,比如:select * from users;
它的value
就是我们查询到的结果集。如果
我们开启缓存这个功能呢,我们第一次查询结果就会放到缓存中。第二次再次查询 [相同的] 的语句,就会命中缓存。它就会直接返回缓存中的结果集,没有命中,
就会再次查询。虽然说缓存比较好,有时也加快了我们的查询速度,但是,但是,但是。它的使用限制确实非常有限。
1.) 要想命中缓存,两次的查询语句必须一模一样
2.) 查询的时候,select
必须是作用于表,也就是你的select * from [table_name];
才有作用,如果是select 1+1;
这是不会有缓存产生的
3.) 比如我们第一查询的时候,有一条记录,在第二次查询的时候,你新增了一条记录,那么缓存一样会失效。就是我们只要涉及到[增,删,改]缓存马上就不会起作用了,
就算是和第一次的查询语句一样,缓存也会失效
4.) 就是我们要得到的数据块,特别大,特别多的时候,我们使用缓存这也是非常消耗内存的
5.) 当查询的时候,我们使用函数,那么缓存一样不会起作用
查看是否使用缓存语句 show status like "Qcache%"
[分析器] 在mysql
没有命中缓存的时候,就会到达下一站,分析器。分析器又分为 词法分析 和 语法分析。
词法分析: 就是mysql
它的一条SQL语句由那些组成,就是mysql
自己的分词[token],我的理解应该就是把写的一条SQL语句一点一点整理出来,然后组成
mysql
它自己所能识别的
语法分析: 语法分析应该就是分析经过词法分析的SQL语句是否符合mysql
的语法
[优化器] 到了这一阶段,可以说,基本上已经走到了一半了。但是还有一个预处理阶段和查询优化器阶段;其实查询优化,就好比是查询执行的路径
-
使用等价变化规则
-
优化count min max 等函数
-
覆盖索引扫描
-
子查询优化
-
提前终止查询 limit 100
-
in的优化 【全表扫描】
-
…
[执行器] 这基本就是最后阶段了,调用执行引擎。当选择了最有的执行方案或执行路径之后,mysql就会执行你的SQL语句了。
[返回客户端] 最后返回你的就是成功或者失败,以及失败原因
以上是小弟的个人学习,可能会有错或者不对的地方,欢迎大家指正,共同学习。