MySQL实战——基础架构

本文涉及的产品
对象存储 OSS,20GB 3个月
云备份 Cloud Backup,100GB 3个月
对象存储 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 来指定内存引擎创建表
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
201 66
|
20天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
2月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
189 3
Mysql高可用架构方案
|
7天前
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
30 8
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
|
17天前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
|
2月前
|
SQL 存储 缓存
【赵渝强老师】MySQL的体系架构
本文介绍了MySQL的体系架构,包括Server层的7个主要组件(Connectors、Connection Pool、Management Service & Utilities、SQL Interface、Parser、Optimizer、Query Caches & Buffers)及其作用,以及存储引擎层的支持情况,重点介绍了InnoDB存储引擎。文中还提供了相关图片和视频讲解。
【赵渝强老师】MySQL的体系架构
|
1月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
2月前
|
消息中间件 Java Kafka
实时数仓Kappa架构:从入门到实战
【11月更文挑战第24天】随着大数据技术的不断发展,企业对实时数据处理和分析的需求日益增长。实时数仓(Real-Time Data Warehouse, RTDW)应运而生,其中Kappa架构作为一种简化的数据处理架构,通过统一的流处理框架,解决了传统Lambda架构中批处理和实时处理的复杂性。本文将深入探讨Kappa架构的历史背景、业务场景、功能点、优缺点、解决的问题以及底层原理,并详细介绍如何使用Java语言快速搭建一套实时数仓。
208 4
|
2月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
93 4
|
2月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
363 1