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. 传纸条---(dp)

    题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mmm行nnn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了. ...

  2. 两矩阵各向量余弦相似度计算操作向量化.md

    余弦相似度计算: \cos(\bf{v_1}, \bf{v_2}) = \frac{\left( v_1 \times v_2 \right)}{||v_1|| * ||v_2|| } \cos(\b ...

  3. 时时监控的rtsp流视频显示在前端与一些css;

    不过试了下只兼容IE. <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  4. linux主要目录

    /:根目录,一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始 当在终端里输入 /home ,其实是在告诉电脑,先从 / (根目录)开始,再进入到 home 目录/ ...

  5. Python学习之旅(十七)

    Python基础知识(16):面向对象编程(Ⅰ) 类和实例 类是抽象的模板 实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,但各自的数据可能不同. 类可以在创建实例的时候,把一些我们 ...

  6. Installing Ruby 2.2 on Centos7

    准备做redis-cluster,需要ruby2.2环境 开整环境:Centos7.2最小安装yum源:阿里的base和epel源 ********************************** ...

  7. HTML、CSS知识点,面试开发都会需要--No.5 文章段落

    No.5 文章段落 1.文字属性 文字属性包含font-*和text-*两类. 2.基于font的属性 (1)font-family:字体属性,多个字体之前用逗号隔开.如果第一个字体没找到,则依次找后 ...

  8. Eclispe最常用的几个快捷键

    熟练使用快捷键可以在很大程度上提高我们的工作效率,Eclipse的快捷键很多,但是常用的也就那么几个,下面说下Eclispe最常用的几个快捷键: Eclipse的快捷键组合可在Eclipse按下ctr ...

  9. Python 学习笔记1 安装和IDE

    前面的话 现在随着互联网的快速发展,对测试人员的代码要求也越来越高.有种逐步往全栈开发人员发展的趋势. 越来越多的手工测试被自动化取代. 对于测试人员,学习一门开发语言迫在眉睫. C#, JAVA, ...

  10. DELPHI中完成端口(IOCP)的简单分析(4)

    DELPHI中完成端口(IOCP)的简单分析(4)   在我以前写的文章中,一直说的是如何接收数据.但是对于如何发送数据却一点也没有提到.因为从代码量上来说接收的代码要比发送多很多.今天我就来写一下如 ...