01 | 基础架构:一条SQL查询语句是如何执行的?

大体可以分为:

  • Server 层:包含了连接器、查询缓存、分析器、优化器、执行器,跨存储引擎的功能都在这一层实现的,比如存储过程、触发器、视图等。
  • 「存储引擎」层,负责数据的存储和提取,支持 InnoDBMemory 等多个存储引擎。innoDB 最常用。create table 语句时,可以使用 engine=memory 指定使用内存引擎创建表。

总结:

  • 连接、鉴权、计算在 server 层,
  • 读写、存取数据在引擎层;

连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接:

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

show processlist 可以查看状态。

  • 数据库里面,「长连接」是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
  • 「短连接」则值每次执行完很少的几次查询,就断开连接,下次查询再重新建立一个

建立连接比较复杂,建议使用中尽量减少连接的动作,尽量使用长连接。但是全部使用长连接之后,MySQL 占用内存涨的特别快,这是因为 MySQL 在执行过程中,临时使用的内存是管理在连接对象里的。这些资源在连接断开时才释放。可能或导致内存赵勇太大,被系统强行杀掉OOM,从现象看,就是 MySQL 异常重启。

可以考虑两种方案:

  1. 定期断开长连接。
  2. 如果使用的是 MySQL 5.7 或更新的版本,可以在每次执行一个比较大的操作之后,执行 mysql_reset_connection 来重新初始化连接资源。

查询缓存

拿到一个查询请求后,想到查询缓存查看,之前是不是执行过这条语句。查询缓存,弊大于利,只要有对表的更新,这个表的查询缓存就会被清空。更新压力大。除非你的业务表就是有一张静态表。MySQL 8.0 直接将查询缓存模块删除了。

分析器

对 SQL 语句做解析。

  • 先做「词法分析」,识别出各个字符串分别是什么。
  • 接着做「语法分析」,判断是否满足 MySQL 语法。

优化器

  • 在表里有多个索引时,决定使用哪个索引;
  • 一个语句有多表关联join时,决定各表的链接顺序;

优化器阶段完成后,语句的执行方案就确定了。

执行器

  • 开始执行时,先判断对表是否有权限;
  • 获取锁,打开表,根据表的引擎定义,使用引擎提供的接口:
    • 使用 InnoDB 引擎接口取第一行数据,在 server 层执行判断逻辑,满足条件,存到结果集中;
    • 调用引擎接口,取下一行,重复上面的判断逻辑,直到表的最后一行
    • 将满足条件的行组成集作为结果返回给客户端

FAQ

  • 如果表 T 中没有字段 K,执行 select * from where k=1,报错,这个错误是在分析器阶段报出来的。
  • wait_timeout 是客户端非交互式的链接时间,交互连接、关联时间参数为 interactive_timeout,这两个时间参数要尽量一致。可以设置分钟级别。
  • wait_timeout 指的是「连接完成后,使用过程中」的等待时间,connection_timeout 指的是「连接过程中」的等待时间。

MySQL 实战笔记的更多相关文章

  1. mysql颠覆实战笔记(五)--商品系统设计(二):定时更新商品总点击量

    继续回到沈老师的MYSQL颠覆实战,首先回顾下上一节课的内容,请大家会看下上节课写的存储过程. 打开prod_clicklog表, 我们只要把日期(不含时分秒)的部分存在数据库中, 如果同一日期有相同 ...

  2. mysql颠覆实战笔记(四)--商品系统设计(一):商品主表设计

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  3. mysql颠覆实战笔记(一)--设计一个项目需求,灌入一万数据先

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  4. mysql颠覆实战笔记(七)--白话理解事务

    今天我们学习web开发级mysql颠覆实战课程第9课没MYSQL事务(一):白话理解事务.前面有两节课第7讲:商品系统设计(四):商品属性设计之自定义属性,第8讲:商品系统设计(五):一维属性的商品价 ...

  5. mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性

    今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:

  6. mysql颠覆实战笔记(三)-- 用户登录(二):保存用户操作日志的方法

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  7. mysql颠覆实战笔记(二)-- 用户登录(一):唯一索引的妙用

    版权声明:笔记整理者亡命小卒热爱自由,崇尚分享.但是本笔记源自www.jtthink.com(程序员在囧途)沈逸老师的<web级mysql颠覆实战课程 >.如需转载请尊重老师劳动,保留沈逸 ...

  8. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  9. Mysql实战45讲 06讲全局锁和表锁:给表加个字段怎么有这么多阻碍 极客时间 读书笔记

    Mysql实战45讲 极客时间 读书笔记 Mysql实战45讲 极客时间 读书笔记 笔记体会: 根据加锁范围:MySQL里面的锁可以分为:全局锁.表级锁.行级锁 一.全局锁:对整个数据库实例加锁.My ...

随机推荐

  1. 6 关于plsql中文显示乱码问题

    打开plsql查看数据表时,会看到中文显示乱码问题 解决方案 输入下图所示语句并运行 在输入下图所示语句并运行,查看第一行和第九行是否对应 3)查看下环境变量的设置,查看是否有变量NLS_LANG,没 ...

  2. 初始easyUI

    1 easyUI布局 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  3. Linux wildcard

    Linux中的通配符: 需要注意的是正则表达式与通配符完全是两个东西.wildcard代表的是bash操作接口的一个功能,而正则表达式是一种字符串处理的方法. 例如,'?',在通配符中表示一个字符,在 ...

  4. 我了解到的新知识之---Cylance Protect是干吗的?

    每家企业都会采购适合自己的杀毒软件来保护企业内的电脑处在安全的状态下,我所在的公司目前在用的是来自美国的初创企业的产品Cylance Protect.,目前这家公司已经在2018年11月份被黑莓公司收 ...

  5. ASP.NET Core 2.1 中 ViewResultExecutor 的变化

    之前在 ASP.NET Core 2.0 中可以正常运行的代码: var services = HttpContext.RequestServices; var executor = services ...

  6. Luogu 1093 - 奖学金 - [排序水题]

    题目链接:https://www.luogu.org/problemnew/show/P1093 题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生 ...

  7. git diff 结果分析

    git diff 的5个使用场景: 1.staging area和working area的文件 (无其他参数时) git diff   2.master分支和working area的文件 (用ma ...

  8. 《Mysql 用户管理》

    一:数据库用户 ROOT 和 其他用户有什么区别么? -  Mysql root 和 linux root 不是一回事,数据库 root 只不过是初始化时候自己建立的一个用户而已,随时可以删除/修改. ...

  9. 深度学习基础(一)LeNet_Gradient-Based Learning Applied to Document Recognition

    作者:Yann LeCun,Leon Botton, Yoshua Bengio,and Patrick Haffner 这篇论文内容较多,这里只对部分内容进行记录: 以下是对论文原文的翻译: 在传统 ...

  10. mybatis中namespace配置方式

    namespace有三种全路径的配置方式: namespace绑定实体类的全路径;绑定dao接口的全路径绑定;mapper的sql.xml文件第一种:namespace绑定实体类的全路径: 当name ...