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. Java课程课堂测试05

    大致要求:将十道计算题输出至TXT文件,再读取文件至控制台,然后在控制台中输入答案并评判对错 我在大致的要求当中已经将我的设计思路体现了出来 首先,实现计算题的设计,第二步要对计算题循环,将答案存到一 ...

  2. Hadoop fs -put bandwidth 暴力版

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  3. Spring-Boot构建多模块项目

    Spring-Boot构建多模块项目 功能模块单独项目开发,可以将一个庞大的项目分解成多个小项目,便于细分开发 Maven多模块项目不能独立存在,必须有一个介质来包含. 1.创建一个Maven 项目, ...

  4. vue 拍照上传图片 demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. python换行语法错误

    a ={ ('住宅', 'https://auction.jd.com/getJudicatureList.html?callback=jQuery4392669&page=1&lim ...

  6. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  7. (一)juc线程高级特性——volatile / CAS算法 / ConcurrentHashMap

    1. volatile 关键字与内存可见性 原文地址: https://www.cnblogs.com/zjfjava/category/979088.html 内存可见性(Memory Visibi ...

  8. python 中的__new__与__init__

    在Python中的class中有两个方法__new__与__init__,有什么区别呢? class TestCls(): """docstring for TestCl ...

  9. MAVEN_day02快速入门

    一.MAVEN工程目录结构 二.怎么在Eclipse中集成M2E插件(工欲善其事必先利其器)有一些准备工作 1.修改自己下载的MAVEN 2.设置本地仓库 三.构建MAVEN工程 1.选择“MAVEN ...

  10. 小程序 showModal content换行

    wx.showModal({ title: '提示', content: '1.该拼团仅支持到指定取货地址自提\r\n2.拼团支付价格为拼团原价,当到达指定阶梯,拼团差价将在3个工作日内退回您的微信账 ...