MySQL实战——基础架构

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
文件存储 NAS,50GB 3个月
简介: 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 来指定内存引擎创建表
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
24天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
2天前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
2天前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
17 1
|
15天前
|
运维 持续交付 API
深入理解并实践微服务架构:从理论到实战
深入理解并实践微服务架构:从理论到实战
47 3
|
16天前
|
存储 缓存 负载均衡
亿级流量架构理论+秒杀实战系列(二)
亿级流量架构理论+秒杀实战系列(二)
|
1月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
32 2
zabbix agent集成percona监控MySQL的插件实战案例
|
1月前
|
运维 监控 持续交付
深入浅出:微服务架构的设计与实战
微服务,一个在软件开发领域如雷贯耳的名词,它代表着一种现代软件架构的风格。本文将通过浅显易懂的语言,带领读者从零开始了解微服务的概念、设计原则及其在实际项目中的运用。我们将一起探讨如何将一个庞大的单体应用拆分为灵活、独立、可扩展的微服务,并分享一些实践中的经验和技巧。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
57 3
|
16天前
|
SQL 缓存 运维
亿级流量架构理论+秒杀实战系列(一)
亿级流量架构理论+秒杀实战系列(一)
|
16天前
|
消息中间件 应用服务中间件 数据库
亿级流量架构理论+秒杀实战系列(三)
亿级流量架构理论+秒杀实战系列(三)
|
2月前
|
SQL 关系型数据库 MySQL
干货!python与MySQL数据库的交互实战
干货!python与MySQL数据库的交互实战