MySQL笔记-基本架构

从根儿上理解MySQL.pdf 立即下载

说明

本文以及接下来的几篇 MySQL 笔记是本人在「极客时间」的专栏『MySQL实战45讲』和掘金小册「MySQL 是怎样运行的:从根儿上理解 MySQL」的学习笔记整理,并参考了一些其他材料加上个人的总结和思考。顺便推荐下这两个专栏。

基本架构

MySQL 基本架构示意图如下:

MySQL 大体可以分为两部分:Server 层和存储引擎层(功能跟日常开发中的 Service 层和与 DAO 层有点像,可以对比理解)。

Server 层

主要有连接器(Connector)、查询缓存(Cache)、分析器(Parser)、优化器(Optimizer)和执行器(Executor)等,包括了 MySQL 的大部分核心功能以及所有内置函数(日期、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,例如存储过程、触发器、视图等。

存储引擎层

存储引擎(Storage Engine)层主要负责数据的存储和提取,它是直接和磁盘打交道的,以插件形式存在,例如 InnoDB、MyISAM、Memory 等多种存储引擎。

从 MySQL 5.5.5 开始,InnoDB 成为了默认的存储引擎。

Server 层

连接器

主要功能:跟客户端建立(TCP)连接、获取权限、维持和管理连接。

若用户认证通过,连接器会查询权限列表获取该用户的权限,之后该连接的权限判断都基于此(因此,一个用户建立连接后,即使被修改了权限也不会影响已存在连接的权限,只有重新建立连接后才生效)。

客户端建立连接示例(分别为失败和成功):

# 连接失败(密码错误)$ mysql -uroot -pEnter password:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
# 连接成功$ mysql -uroot -pEnter password:Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.7.19 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

进入 MySQL 后可以用如下命令查看连接状态:

# 查看连接状态mysql> show processlist;+----+------+-----------+------+---------+------+----------+------------------+| Id | User | Host      | db   | Command | Time | State    | Info             |+----+------+-----------+------+---------+------+----------+------------------+|  6 | root | localhost | NULL | Sleep   |   81 |          | NULL             ||  7 | root | localhost | NULL | Query   |    0 | starting | show processlist |+----+------+-----------+------+---------+------+----------+------------------+2 rows in set (0.00 sec)

在 Command 列中,Sleep 表示该连接是空闲的。

连接成功后是有超时时间的,若太长时间没有操作会断开连接,由参数 wait_timeout 控制,默认为 8 小时,

查询缓存

主要功能:缓存查询结果。

连接建立之后,就可以进行查询了。

在一个查询语句中,会先到缓存中查询之前是否查询过该语句,若存在则直接返回对应的结果;否则继续执行后面的流程。

PS: 此处理流程可以类比我们在项目中使用 Redis 等作为缓存的操作,即先查缓存,再查 DB。

也可以通过使用 SQL_CACHE 显式指定使用查询缓存(这里的 id 并非主键),例如:

SELECT SQL_CACHE * FROM t1 WHERE id=10;

查询缓存的优缺点:

1. 优点:查询命中缓存时效率很高。

2. 缺点:缓存失效非常频繁,只要有对一个表的更新,该表所有的查询缓存都会被清空。

由于上述优缺点,可以发现缓存适用于静态表或更新较少的表,对于更新较频繁的表并不适用。值得一提的是,MySQL 8.0 版本已删除了查询缓存功能,可见该功能比较鸡肋。

分析器

主要功能:对 SQL 语句进行词法分析和语法分析。

1. 词法分析:分词操作,由于我们传递给 MySQL 的 SQL 语句实质上就是一个字符串,MySQL 需要将其拆分成一个个的分词(语法树)并进行识别,例如识别“SELECT”、“UPDATE”等关键字,将 t1 识别为一张表,将 id 识别为一列等。

2. 语法分析:拿到词法分析的结果,并根据语法规则判断 SQL 语句是否合法。若语法错误,则会收到如下错误提示:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ...

优化器

主要功能:优化 SQL 语句。

经过了分析器之后,MySQL 已经知道了我们提交的 SQL 语句是干嘛的。但为了提高执行效率,它并非完全按照我们的 SQL 语句执行,而要进行一系列优化。例如,当表中有多个索引时决定使用哪个索引;多表关联(JOIN)查询时决定表连接的顺序等等。

PS: 有点类似于 JVM 执行 Java 代码时的操作。即,JVM 并非完全按照代码的先后顺序来执行的,它会调整一些代码的执行顺序以提高效率,只是保证最终结果与代码顺序执行的效果一致。

执行器

主要功能:执行 SQL 语句。

MySQL 知道了我们要做什么,并且进行了优化,接下来就要开始执行了。执行之前,会判断你对该表是否有查询的权限,若有权限则继续执行;否则会返回如下错误(这里以 SELECT 操作为例,其他类似):

SELECT command denied to user 'user'@'localhost' for table 't1'

为什么到这一步才进行权限检查呢?

是因为有时候 SQL 语句要操作的表不只是 SQL 字面上的那些(例如触发器要在执行过程中才能确定),因此权限检查在这里进行。

存储引擎

以上述 SELECT 语句为例,执行步骤如下:

1. 调用 InnoDB 引擎接口取 t1 表的第一行,判断 id 是否为 10,若不是则跳过;否则将这一条记录存在结果集中;

2. 调用存储引擎接口读取“下一行”,判断逻辑同步骤 1,直至读取到表的最后一行;

3. 执行器将上述遍历过程中所有满足条件的记录作为结果集返回给客户端。

MySQL 查看所有存储引擎:

mysql> show engines;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        || MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         || MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         || BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         || MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         || CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         || ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         || PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         || FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+9 rows in set (0.00 sec)

其中 Support 表示该引擎是否可用(DEFAULT 表示默认值);Comment 是描述信息;Transactions 表示是否支持事务;XA 表示是否支持分布式事务;Savepoints 表示是否支持回滚。

其中最为常用的就是 InnoDB 引擎,而且它也是默认的。其他常见的还有 MyISAM 和 Memory 引擎,这三种引擎简单对比如下:


MyISAMInnoDBMemory
存储限制256TB64TB
事务
索引
表锁行级锁表锁
外键

小结

MySQL 的整体架构主要分为两部分:Server 层和存储引擎层。

Server 主要有连接器、查询缓存、分析器、优化器和执行器等,包括了 MySQL 的大部分核心功能以及所有内置函数,所有跨存储引擎的功能都在这一层实现,例如存储过程、触发器、视图等。

存储引擎层:负责数据的存储和提取,以插件形式存在,例如 InnoDB (MySQL 5.5.5 以后默认的存储引擎)、MyISAM、Memory 等多种存储引擎。

PS: 发现一个现象,许多东西在学的时候觉得不难,但是如果自己不去做笔记的话就很容易忘记。因此就需要用自己的语言去表达出来,这样更能促进思考,也能进一步“内化”到自己的知识体系中。

MySQL 是怎样运行的:从根儿上理解 MySQL(下).pdf 立即下载

相关推荐

MySQL是怎样运行的(仅限学习使用)

MySQL是怎样运行的(仅限学习使用)

Web前端架构

8年前端架构经验介绍前端架构搭建和实现的步骤和方法分析架构中的各项技术要点和解决方案通过技术手段提升团队的规范性和生产效率 

MySQL是怎样运行的:从根儿上理解MySQL

MySQL是怎样运行的:从根儿上理解MySQL

【面试必备,SpringBoot:RabbitMQ-延迟队列

spring.rabbitmq.listener.simple.acknowledge-mode=manual # [](https://gitee.com/vip204888/java-p7)具体编码 ## [](https://gitee.com/vip204888/java-p7)定义队列 如果手动创建过或者`RabbitMQ`中已经存在该队列那么也可以省略下述代码… package com.battcn.config; import org.slf4j.Logger; import org.s

m0_56255097的博客 441

SpringCloud 基础——Eureka服务注册中心

Eureka 服务注册中心是微服务架构中是最核心、最基础的组件。主要用来实现微服务实例的自动化注册和发现。在微服务中也是最先被启动的,各个功能、各个模块都要 Eureka 注册中心的支持

贵在坚持 500

《剑指offer刷题笔记(9),美团优选面试题Java

minStack.push(-1); minStack.push(3); minStack.push(-4); minStack.getMin(); --> Returns -4. minStack.pop(); minStack.top(); --> Returns 3. minStack.getMin(); --> Returns -1. ### [](https://gitee.com/vip204888/java-p7)**思路** **(单调栈)**

m0_56146626的博客 309

mysql基本架构及select语句执行过程(笔记)

MySQL基本架构示意图,从中你可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory

MariaOzawa的博客 900

负责连接mysql的框架是_mysql学习笔记1(mysql基本架构

mysql基本架构图如图所示:1 . MySQL 可以分为 Server 层和存储引擎层两部分Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyIS...

weixin_35241774的博客 153

【读书笔记MySQL实战45讲—基本架构

课程来自极客时间《MySQL实战45讲》 文章目录Server层连接器全部使用长连接的弊端?解决方案查询缓存为什么大多数情况下不要使用查询缓存?如何指定查询缓存?分析器优化器执行器存储引擎层问题 MySQL可分为Server层和存储引擎层两部分 Server层 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 连接器 连接器负责跟客户.

学海无涯乐作舟 411

MySQL45讲笔记(一)-----MySQL基本架构

MySQL基本架构 架构 大体来说,MySQL可以分为Server层和存储引擎层两部分。 Server层 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在 这一层实现,比如存储过程、触发器、视图等 存储引擎层 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MyS

m0_37852301的博客 170

MySQL学习笔记 - 1 - 基本架构与日志两阶段提交

MySQL基本架构 MySQL大致可以分为Server层和存储引擎层 Server层包括连接器,查询缓存,解析器,预处理器,优化器,执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器和视图等 连接器 负责跟客户端建立连接,获取权限,维持和管理连接 用户名密码验证通过后,连接器会到权限表中查询用户的权限,之后这个链接里面的权限判断逻辑,都依赖于此时读取的权限;即使使用管理员账...

weixin_34143774的博客 356

MySQL学习笔记(二)—— MySQL基本架构与锁

MySql架构 SQL Layer Connection Pool : 连接池,用于接收连接请求和管理连接。 ManagementService&Utilities 管理服务组件和工具组件,主要提供了一些备份,安全,主从,集群,等功能。 SQL Interface:主要提供了SQL语句接口。包括SQL解析器,优化器,缓存等。将我们输入的SQL语句,解析成节点树,然后传递给存储引擎执行...

vcj1009784814的博客 348

Mysql学习】笔记一、架构基本了解

一、架构图 二、说明 1、最上层:链接处理、授权认证、安全等 2、第二层:大多数的核心服务(查询解析、分析、优化、缓存以及所有的内置函数) 函数(日期、时间、数学、加密函数)跨存储引擎的功能都在这一层实现:存储过程、触发器、视图 3、第三层:存储引擎负责数据的存储和提取,通过API与存储引擎进行通信。不通引擎之间也不会相互通信,只是简单地响应上层服务的请求。 1、连接管理与安全性 认证基于用户名、原始主机信息和密码,认证成功会继续验证是否具有执行某个特定的查询权限。 2、优化与执行 3、并发控制:多个查询

promiseful的博客 170

MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“

MySQL实战45讲》学习笔记01-03: 01 | 基础架构:一条SQL查询语句是如何执行的? 02 | 日志系统:一条SQL更新语句是如何执行的? 03 | 事务隔离:为什么你改了我还看不见?

娜娜米的博客 833

mysql进阶学习笔记(基础知识:基本架构,日志,事务,索引,锁概念)

基本架构 连接器 mysql -h$ip -P$port -u$user -p mysql -u root -p 密码(最好不要写出来) 查询缓存 之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中 key 是查询的语句,value 是查询的结果 PS:对于更新压力大的操作,缓存命中率会非常低 可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存 显式指定使用查询缓存。 mysql> select SQL

我是要成为海贼王的男人! 346

读《MySQL性能调优与架构设计》笔记MySQL Query Optimizer基本工作原理

MySQL中有一个专门负责优化SELECT 语句的优化器模块,这就是我们本节将要重点分析的MySQL Optimizer,其主要的功能就是通过计算分析系统中收集的各种统计信息,为客户端请求的Query 给出他认为最优的执行计划,也就是他认为最优的数据检索方式。 当MySQLOptimizer 接收到从Query Parser (解析器)送过来的Query 之后,会根据MySQL Query

lihuayong的专栏 1471

MYSQL性能调优与架构设计学习笔记 - 基础篇 MYSQL基本介绍

为什么80%的码农都做不了架构师?>>> ...

weixin_33816821的博客 144

读《MySQL性能调优与架构设计》笔记之Query语句优化基本思路和原则

在分析如何优化MySQLQuery 之前,我们需要先了解一下Query 语句优化的基本思路和原则。一般来说,Query 语句的优化思路和原则主要提现在以下几个方面:         1. 优化更需要优化的Query;         2. 定位优化对象的性能瓶颈;         3. 明确的优化目标;         4. 从Explain 入手;         5. 多使用pro

lihuayong的专栏 1265
上一篇: JDK源码分析-ThreadPoolExecutor
下一篇: JDK源码分析-FutureTask
WriteOnRead
博客等级 码龄13年 126粉丝 144原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值