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. Tcp/IP 的四层模型

    维基:https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F 因特网协议组 LITA 因特网协议组 Link  网络接口层 以太 ...

  2. 3.nodejs(三) 常用API

    1.querystring querystring: --- > qs npm i qs ==> qs:parse/stringify第三方插件,只有一个参数 JSON.parse  字符 ...

  3. super方法 调用父类的方法

    描述 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO).重复 ...

  4. python 三方面库整理

    测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. –推荐 mechanize- Python中有状 ...

  5. Linux命令 umask

    umask: 文件预设权限 指定当前用户在创建文件或目录时的权限默认值. $ umask0002$ umask -Su=rwx,g=rwx,o=rx 创建文件时,预设没有x 权限,即只有rw 权限,最 ...

  6. LeetCode 448 Find All Numbers Disappeared in an Array 解题报告

    题目要求 Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice a ...

  7. SpringBoot-性能优化之扫包优化

    性能优化 组件自动扫描带来的问题 默认情况下,我们会使用 @SpringBootApplication 注解来自动获取应用的配置信息,但这样也会给应用带来一些副作用.使用这个注解后,会触发自动配置( ...

  8. Oracle不连续的值,如何实现查找上一条、下一条

    1.  遇到的问题 已知一个题库,希望实现当前页切换上一题,下一题的需求. 查看得知,数据库中用于查询的字段(主键)是不连续的.如上图所示:stxh为主键number类型. 2.  实现方式lead ...

  9. 用stm32f10x建立新的工程重要步骤

    stm32f10x系列新建空的工程主要原理: 1.添加启动文件 不同的芯片类型的启动文件的容量是不同的,选择适合该芯片的容量作为启动文件. 注意:启动文件是汇编语言编写的,所以文件的后缀名为.s 2. ...

  10. 025-缓存Cache

    如果每次进入页面的时候都查询数据库生成页面内容的话,如果访问量非常大,则网站性能会非常差.而如果只有第一次访问的时候才查询数据库生成页面内容,以后都直接输出内容,则能提高系统性能.这样无论有多少人访问 ...