MySQL实战——基础架构

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: MySQL架构 MySQL 可以分为 Server 层和存储引擎层两部分。不同的存储引擎共用一个Server层。 Server层 概述 Server层包括 连接器 查询缓存 分析器 优化器 执行器 ... Server层功能 MySQL大多数核心服务功能 所有的内置函数,如日期、时间、数学和加密函数等 跨存储引擎的功能,如存储过程、触发器、视图等 连接器 连接器做什么? 连接器负责跟客户端建立连接、获取权限、维持和管理连接。

本文属于个人备忘录,主要是极客时间《MySQL实战45讲》学习笔记。

MySQL架构

image.png

MySQL 可以分为 Server 层和存储引擎层两部分。不同的存储引擎共用一个Server层。

Server层

概述

Server层包括

  • 连接器
  • 查询缓存
  • 分析器
  • 优化器
  • 执行器
  • ...

Server层功能

  • MySQL大多数核心服务功能
  • 所有的内置函数,如日期、时间、数学和加密函数等
  • 跨存储引擎的功能,如存储过程、触发器、视图等

连接器

连接器做什么?

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

连接命令示例

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

其中,mysql是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

  • 如果用户名或密码不对,会收到"Access denied for user"错误,客户端结束执行
  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

    • 这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。
    • 权限修改完成后,只有再新建的连接才会使用新的权限设置。
  • 连接完成后,如果没有后续的动作,这个连接就处于空闲状态,可以用show processlist命令看该链接状态。如下。

    • 其中Command列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。
mysql> show processlist;
+----+----------+-----------------+---------+---------+--------+-----------+------------------+
| Id | User     | Host            | db      | Command | Time   | State     | Info             |
+----+----------+-----------------+---------+---------+--------+-----------+------------------+
| 28 | testuser | localhost:60453 | db_test | Sleep   |      8 |           | NULL             |
| 29 | testuser | localhost:53231 | db_test | Query   |      0 | starting  | show processlist |
+----+----------+-----------------+---------+---------+--------+-----------+------------------+
25 rows in set (0.00 sec)

客户端如果太长时间没动静,连接器会自动断开。这个时间是由参数wait_timeout控制的,默认值是8小时。

mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.01 sec)

mysql>

如果在连接被断开之后,客户端再次发送请求的话,会收到一个错误:Lost connection to MySQL server during query。这时候如果要继续,就需要重连后再执行请求。

什么是长连接?

长连接:指连接成功后,如果客户端持续有请求,则一直使用同一个连接。

建立连接的过程通常比较复杂,建议使用中要尽量减少建立连接的动作,即尽量使用长连接。

什么是短连接?

短连接:指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

长连接的影响

影响

  • 全部使用长连接后,可能会发现,有些时候MySQL占用内存涨得特别快。
  • 如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),看起来是MySQL异常重启。

原因

  • 是因为MySQL在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。

解决办法

  • 定期断开长连接。

    • 使用一段时间,或者程序里面判断执行过一个占用内存的大查询后断开连接,之后查询时再重连。
  • 执行mysql_reset_connection重新初始化连接资源

    • MySQL >= 5.7版本
    • 在每次执行一个比较大的操作后,重新初始化链接资源
    • 这个过程不需要重连和重新鉴权,但是会将连接恢复到刚刚创建完时的状态

查询缓存

连接建立完成后,就可以进行查询了。MySQL接到一个查询请求后,会先查询缓存。

  • 如果语句在缓存中,则其对应的结果会被直接返回给客户端,以提高查询效率。
  • 如果语句不在缓存中,会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。

但是大多数情况下不要使用查询缓存。因为查询缓存往往弊大于利。

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

  • 不使用缓存

    • 对于更新压力大的数据库来说,查询缓存的命中率会非常低。
  • 可使用缓存

    • 业务是一张静态表,很长时间才会更新一次。
    • 比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

可通过设置参数query_cache_type来设置要不要使用查询缓存。

  • DEMAND

    • 默认都不使用查询缓存
  • SQL_CACHE

    • 显式指定使用查询缓存,如
mysql> select SQL_CACHE * from T where ID=10;

通常情况下,该参数设置为OFF,即关闭查询缓存即可。

mysql> show variables like 'query_cache_type';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| query_cache_type | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

注意

  • MySQL 8.0版本直接将查询缓存的整块功能删掉了,即8.0开始彻底没有这个功能了。

分析器

分析器做什么?

  • 词法分析

    • 识别SQL语句各个字符串是什么、代表什么
  • 语法分析

    • 根据语法规则,判断SQL语句是否满足MySQL语法
    • 如果语句不对,会报“You have an error in your SQL syntax”错误
mysql> elect * from t where ID=1;

ERROR 1064 (42000): 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 'elect * from t where ID=1' at line 1

一般语法错误会提示第一个出现错误的位置,需要关注紧接“use near”的内容。

优化器

优化器做什么?

  • 在表里面有多个索引的时候,决定使用哪个索引
  • 或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

比如执行下面这样的语句,这个语句是执行两个表的join:

mysql> select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

两种执行方法

  • 先从表t1里面取出c=10的记录的ID值,再根据ID值关联到表t2,再判断t2里面d的值是否等于20
  • 先从表t2里面取出d=20的记录的ID值,再根据ID值关联到t1,再判断t1里面c的值是否等于10

这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。

执行器

分析器:要做什么
优化器:怎么做

执行步骤

  • 鉴权

    • 没有:返回无权限错误
    • 有:继续
  • 打开表执行

    • 打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

有索引查询

  • 第一次调用的是“取满足条件的第一行”这个接口
  • 之后循环调用“满足条件的下一行”这个接口

无索引查询

  • 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10

    • 如果不是则跳过
    • 如果是则将这行存在结果集中
  • 调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行
  • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端

扫描了多少行?

  • 数据库慢查询日志中有一个rows_examined字段,表示这个语句执行过程中扫描了多少行
  • 这个值就是在执行器每次调用引擎获取数据行的时候累加的

存储引擎层

  • 存储引擎层负责数据的存储和提取
  • 架构模式是插件式的,支持InnoDB、MyISAM、Memory 等多个存储引擎
  • 目前最常用的存储引擎是InnoDB,它从MySQL 5.5.5 版本开始成为了默认存储引擎

比如,执行create table建表时,

  • 如果不指定引擎类型,默认使用的就是 InnoDB
  • 使用engine=memory 来指定内存引擎创建表
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
95 0
|
2天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
17 1
|
5天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
12天前
|
存储 关系型数据库 MySQL
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
【4月更文挑战第9天】InnoDB数据库使用B+树作为索引模型,其中主键索引的叶子节点存储完整行数据,非主键索引则存储主键值。主键查询只需搜索一棵树,而非主键查询需两次搜索,因此推荐使用主键查询以提高效率。在插入新值时,B+树需要维护有序性,可能导致数据页分裂影响性能。自增主键在插入时可避免数据挪动和页分裂,且占用存储空间小,通常更为理想。然而,如果场景仅需唯一索引,可直接设为主键以减少查询步骤。
13 1
【MySQL实战笔记】 04 | 深入浅出索引(上)-02
|
14天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
29 5
|
16天前
|
SQL 存储 关系型数据库
【MySQL实战笔记】02.一条SQL更新语句是如何执行的-2
【4月更文挑战第5天】两阶段提交是为确保`redo log`和`binlog`逻辑一致,避免数据不一致。若先写`redo log`, crash后数据可能丢失,导致恢复后状态错误;若先写`binlog`,crash则可能导致重复事务,影响数据库一致性。一天一备相较于一周一备,能缩短“最长恢复时间”,但需权衡额外的存储成本。
16 1
|
26天前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
74 0
|
26天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
30 0
|
1月前
|
存储 Kubernetes 关系型数据库
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
44 0
|
1月前
|
架构师 算法 关系型数据库
数据库架构师之道:MySQL安装与系统整合指南
数据库架构师之道:MySQL安装与系统整合指南
45 0