Mysql:一条sql是如何执行的?

导读:本篇文章讲解 Mysql:一条sql是如何执行的?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

mysql的逻辑架构

图1
根据mysql的逻辑架构图,我们可以看出Mysql可以分为Server层和存储引擎层两部分。
Server层:Server层包括连接器查询缓存分析器优化器执行器等,涵盖了Mysql中的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学、加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层:存储引擎层负责数据的存储提取。器架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL5.5版本开始就成为了默认存储引擎。例如需要指定存储引擎可以在create table的时候使用engine=memory来指定内存引擎创建表。

  1. 连接器:负责跟客户端建立连接、获取权限、维持和管理连接。
    需要注意的是在连接中尽量避免长连接,因为Mysql在执行过程中临时使用的内存是管理在连接对象里面的,如果长连接累积下来可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是Mysql异常重启了。
    可以考虑两种方案解决:
    1.定期断开长连接。使用一段时间,或者程序判断执行过一个占用内存的大查询后,断开连接,之后查询再重连。
    2.如果使用的是Mysql5.7或者更新版本,可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
  2. 查询缓存:连接建立完成后,就可以执行select语句了,然后就开始查询缓存,mysql会将之前执行过的sql语句以及结果以key-value对的形式缓存到内存中,或许如果命中则不需要执行查询操作直接返回结果。
    但是大多数形况下,建议不要使用查询缓存,因为查询缓存往往弊大于利
    查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能查询缓存还没有使用就一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。但是如果你使用的时配置表,也就是很长时间才会更新一次的表,那这张表上的查询才适合使用查询缓存。
    Mysq可以设置参数query_cache_type为DEMAND就可以不使用查询缓存了,这样默认的sql语句就不使用查询缓存了。如果确定要使用查询缓存的语句可以使用SQL_CACHE显示指定,例如下面:
select SQL_CACHE * from T where ID=10

注意:MYSQL8.0版本直接将查询缓存的整块功能删掉了,8.0彻底没有这个功能了。

  1. 分析器:分词器先会对sql语句进行”词法分析“,这个就是根据sql的语法规则做语句语法规则的校验。
  2. 优化器:sql语句在执行前需要先经过优化器的处理,也就是Mysql会根据”特定经验“(执行计划)来决定选择更优的执行顺序
  3. 执行器:开始执行前先判断有没有执行的权限,比如:查询权限、更新权限、删除权限等,如果没有返回错误提示。

sql语句各关键字执行顺序图

图2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/72647.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!