一条sql的执行[mysql]

这段时间得好好深入地进入到mysql的内部,探求其内部秘密,写出更好的sql,以便面试可以吹更大的🐂13

 

 

 

                                 mysql基本架构示意图

mysql分为Server和存储引擎两个部分,Server包括连接器,查询缓存,分析器,优化器,执行器。

连接器:

执行连接mysql时候,使用

mysql -h$ip -P$port -u$user -p$password

错误:提示 “Access denied for user”

正确:连接器会到权限表中查询拥有的权限信息,之后连接中的权限判断都依赖此时读取到的权限

使用长连接保持数据库的连接,为了防止内存太大导致溢出,可以定期断开长连接,然后查询时候在重连。

如果是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存:

 1 连接建立完成后,你就可以执行 select 语句了。执行逻辑就会来到第二步:查询缓存。
 2 
 3 MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。
 4 
 5 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。
 6 
 7 但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。
 8 
 9 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
10 
11 好在 MySQL 也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:
12 
13 mysql> select SQL_CACHE * from T where ID=1014 需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

以上为引用-自购极客时间,林老师课程

分析器:

  解析sql语句识别字符串,语法校验

优化器:

  一张表中索引如果有多个,决定使用索引

  连表查询时候,是先执行左表还是右表的操作

执行器:

  先判断当前连接是否有操作表的权限,再执行sql语句

--以上为学习笔记

 

posted @ 2020-11-10 11:24  孤燕南飞  阅读(90)  评论(0编辑  收藏  举报