MySQL实战——基础架构

本文涉及的产品
对象存储 OSS,标准 - 本地冗余存储 20GB 3个月
日志服务 SLS,月写入数据量 50GB 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 来指定内存引擎创建表
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
人工智能 监控 前端开发
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
支付宝「AI 出行助手」是一款集成公交、地铁、火车票、机票、打车等多项功能的智能出行产品。
619 21
支付宝 AI 出行助手高效研发指南:4 人团队的架构迁移与提效实战
|
3月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
234 7
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
677 3
|
4月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
3月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
657 0
|
4月前
|
存储 SQL 监控
数据中台架构解析:湖仓一体的实战设计
在数据量激增的数字化时代,企业面临数据分散、使用效率低等问题。数据中台作为统一管理与应用数据的核心平台,结合湖仓一体架构,打通数据壁垒,实现高效流转与分析。本文详解湖仓一体的设计与落地实践,助力企业构建统一、灵活的数据底座,驱动业务决策与创新。
|
4月前
|
存储 设计模式 人工智能
AI Agent安全架构实战:基于LangGraph的Human-in-the-Loop系统设计​
本文深入解析Human-in-the-Loop(HIL)架构在AI Agent中的核心应用,探讨其在高风险场景下的断点控制、状态恢复与安全管控机制,并结合LangGraph的创新设计与金融交易实战案例,展示如何实现效率与安全的平衡。
746 0
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南
|
2月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
287 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构

热门文章

最新文章

推荐镜像

更多
下一篇
oss云网关配置