【Mysql系列】(一)MySQL语句执行流程(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【Mysql系列】(一)MySQL语句执行流程(下)

因为长连接导致 OOM 怎么办

如果长连接导致了内存不足(OOM),可以考虑以下几种方式来解决该问题:

  1. 减少连接池中的连接数:如果连接数过多导致内存不足,可以尝试减少连接池中的连接数。通过调整连接池的配置参数,例如最大连接数(max connections),可以限制连接的数量。
  2. 设置连接超时时间:增加连接的空闲超时时间(idle timeout),使得空闲的连接在一段时间后被自动关闭,释放内存资源。可以通过设置 MySQL 服务器的wait_timeout参数或连接池的相关配置来实现。
  3. 定期清理无效连接:定期检查连接池中的连接,清理掉长时间未使用或已关闭的连接,释放内存资源。可以编写一个定时任务或使用连接池提供的相关机制来实现。
  4. 考虑使用短连接:如果长连接仍然导致 OOM,可以考虑使用短连接的方式。在每次数据库操作之后,立即关闭连接,避免长时间占用连接资源。不过,这样会引入连接建立和断开的开销,可能会降低性能。
  5. 增加服务器内存:如果以上方法无法解决 OOM 问题,可以考虑增加服务器的内存容量,以提供更多的资源来支持长连接。

在解决 OOM 问题时,需要根据具体情况进行调整和优化。可以根据应用程序的负载情况、数据库连接的使用情况以及服务器的资源配置来选择合适的方法。同时,也建议进行性能测试和监控,以及仔细分析和调优应用程序和数据库的性能瓶颈。

查询缓存

什么是 MySQL 查询缓存

MySQL 查询缓存是 MySQL 数据库的一项功能,用于缓存查询的结果集。它可以在执行查询语句时,将查询结果缓存到内存中,以便后续相同的查询可以直接从缓存中获取结果,而不需要再次执行相同的查询操作。

MySQL 查询缓存的工作原理如下:

  1. 当执行一个查询语句时,MySQL 会首先检查查询缓存,看看是否有与当前查询语句完全匹配的缓存结果。
  2. 如果有匹配的缓存结果,MySQL 会直接从缓存中获取结果,并将其返回给客户端,而不需要再次执行查询。
  3. 如果没有匹配的缓存结果,MySQL 会执行查询操作,获取查询结果,并将其存储到缓存中,以备后续相同的查询使用。

MySQL 查询缓存的优点包括:

  • 提高查询性能:对于相同的查询语句,可以直接从缓存中获取结果,避免了再次执行查询的开销,提高了查询性能。
  • 减少服务器负载:查询缓存可以减少数据库服务器的负载,因为相同的查询不需要再次执行,减少了 CPU 和 IO 的消耗。

然而,MySQL 查询缓存也有一些限制和注意事项:

  • 查询缓存的匹配粒度:MySQL 查询缓存是根据完全匹配查询语句的方式进行缓存的,即查询语句的文本完全相同。如果查询语句中有任何微小的差异,比如空格、大小写等,就无法从缓存中获取结果。
  • 缓存的更新频率:当对某个表进行更新操作(插入、更新、删除)时,与该表相关的缓存会被清空,需要重新执行查询。这可能导致缓存的频繁失效,降低了缓存的效果。
  • 内存消耗:查询缓存需要占用一定的内存空间来存储缓存结果,如果缓存的数据量较大,可能会占用大量的内存资源。此外,查询缓存是基于查询语句进行缓存的,对于相同的查询语句,即使查询结果不同,也会使用相同的缓存空间。

由于一些限制和性能问题,MySQL 5.7 版本开始移除了查询缓存功能。在较新的 MySQL 版本中,通常建议通过其他手段(如索引优化、查询优化)来提高查询性能,而不是依赖查询缓存。

为什么不建议使用查询缓存

查询缓存在过去是 MySQL 的一个功能,用于提高查询性能。然而,随着时间的推移,查询缓存的使用逐渐被认为不再是一个推荐的数据库优化策略。以下是一些原因,解释为什么不建议使用查询缓存:

  1. 锁粒度和高并发问题:MySQL 查询缓存的实现方式导致在高并发环境下存在锁粒度问题。当对某个表进行更新操作时,相关的查询缓存会被锁定,从而导致其他查询被阻塞,降低了并发性能。
  2. 缓存失效频繁:MySQL 查询缓存的缓存失效频率较高。**一旦对某个表进行了更新操作,与该表相关的缓存都会被清空,需要重新执行查询 **。这导致缓存的命中率较低,而缓存失效的开销却很高。

内存消耗和不可扩展:查询缓存需要占用一定的内存空间来存储缓存结果,如果缓存的数据量较大,可能会占用大量的内存资源。而且,查询缓存是基于查询语句进行缓存的,对于相同的查询语句,即使查询结果不同,也会使用相同的缓存空间。这导致了内存的浪费,并且不适用于大规模数据库和高并发环境。

  1. 缓存一致性和数据更新问题:由于 MySQL 查询缓存是以查询语句为基础进行缓存的,当有数据更新操作时,缓存的一致性可能会受到影响。如果多个客户端同时对同一表进行更新操作,会导致查询缓存中的数据与实际数据不一致。
  2. 查询优化器限制:使用查询缓存后,MySQL 查询优化器的选择余地受到限制。查询缓存只适用于完全匹配的查询语句,如果查询语句有微小差异(如空格、大小写等),无法从缓存中获取结果。这可能会导致查询优化器无法灵活选择最佳的查询计划。

考虑到以上问题,MySQL 5.7 版本开始移除了查询缓存功能,并且在更高版本中不再推荐使用。现代的数据库优化策略更侧重于调整索引、查询优化、缓存层、硬件升级等方面来提高性能和可扩展性。

「需要注意 MySQL8.0 版本已经删掉了查询缓存的功能」

分析器

什么是 MySQL 分析器

MySQL 分析器(MySQL Analyzer)是指用于分析和优化 MySQL 数据库性能的工具或技术。它可以帮助开发人员和数据库管理员识别数据库查询的瓶颈,并提出性能优化建议。

MySQL 分析器通常提供以下功能:

  1. 查询执行计划分析:分析器可以解析和分析数据库查询的执行计划。执行计划描述了 MySQL 查询优化器将如何执行查询,包括使用哪些索引、连接方式、排序方式等。通过分析执行计划,可以确定查询的性能瓶颈和潜在优化点。
  2. 查询性能评估:分析器可以评估查询的性能,并提供查询的执行时间、扫描的行数、使用的索引等关键指标。通过比较不同查询的性能评估结果,可以确定哪些查询需要优化以提高性能。
  3. 索引分析与优化:分析器可以帮助识别数据库表中缺失或不合适的索引。它可以分析查询的执行情况,检查哪些查询没有使用索引,或者哪些查询使用了慢速索引。基于这些分析结果,可以提出创建、修改或删除索引的建议。
  4. SQL 语句优化建议:分析器可以分析 SQL 语句,提供优化建议。它可以检查 SQL 语句的语法、查询结构和性能问题,并提供有关如何重写查询、使用更有效的查询方式的建议。
  5. 系统性能监控:一些分析器还提供系统性能监控功能,可以收集和分析数据库服务器的性能指标,如 CPU 利用率、内存使用情况、磁盘 IO 等。这些指标可以帮助识别系统瓶颈和资源瓶颈,并进行性能调优。

常见的 MySQL 分析器工具包括 Explain、pt-query-digest、Percona Toolkit、MySQL Enterprise Monitor 等。这些工具提供了丰富的分析和优化功能,可以帮助开发人员和数据库管理员更好地优化 MySQL 数据库的性能。

如果你的语句不对,就会收到You have an error in your SQL syntax的错误提醒,比如下面这个语句 select 少打了开头的字母“s”。

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

优化器

什么是 MySQL 优化器

MySQL 优化器(MySQL Optimizer)是 MySQL 数据库中的一个组件,负责分析和优化查询语句的执行计划,以提高查询性能。它根据查询语句的结构和表的统计信息,选择最佳的查询执行策略和访问路径。

MySQL 优化器的主要功能包括:

  1. 查询重写:MySQL 优化器会对查询语句进行重写,以便更好地利用索引、避免全表扫描等。它可以通过改变查询的连接顺序、引入临时表、使用覆盖索引等方式来优化查询。
  2. 查询优化:MySQL 优化器会分析查询语句的结构和表的统计信息,以选择最佳的执行策略。它会考虑索引的选择、连接类型(如嵌套循环连接、哈希连接、排序连接)、排序方式、聚合操作等因素,以尽量减少查询的成本和执行时间。
  3. 索引选择:MySQL 优化器会根据查询条件和表的索引信息,选择最适合的索引来加速查询。它会考虑索引的选择性、覆盖度、排序方式等因素,以提高索引的效率和查询的性能。
  4. 统计信息收集:MySQL 优化器会定期收集和更新表的统计信息,如行数、索引分布、列的基数等。这些统计信息对于优化器选择最佳执行计划至关重要,它可以根据统计信息来估计查询的成本和选择最佳的执行路径。

MySQL 优化器是一个智能的查询执行计划生成器,它会根据查询语句和表的信息,通过优化算法来选择最佳的查询执行策略。但有时候,优化器的决策可能不是最优的,因此,对于特定的查询场景,可能需要手动干预和优化查询语句、索引设计等方面。

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(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。

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

执行器

什么是 MySQL 执行器

MySQL 执行器(MySQL Executor)是 MySQL 数据库的一个组件,负责执行查询语句并返回结果。它是 MySQL 查询处理的最后一步,负责将优化器生成的查询执行计划转换为具体的操作和结果。

MySQL 执行器的主要功能包括:

  1. 查询解析和预处理:执行器首先对查询语句进行解析,识别查询类型、表名、列名等元素,并对其中的占位符进行替换。然后,执行器会进行查询预处理,检查和验证查询语句的语法和语义是否正确。
  2. 权限验证:在执行查询之前,执行器会进行权限验证,检查当前用户是否具有执行查询所需的权限。它会检查用户是否具有访问特定数据库、表或列的权限,以及执行特定操作(如 SELECT、INSERT、UPDATE、DELETE)的权限。
  3. 查询执行:执行器会根据优化器生成的查询执行计划,执行具体的操作。它会根据查询的类型(如 SELECT、INSERT、UPDATE、DELETE)和所需的操作,进行表的扫描、索引的搜索、数据的读取、修改等操作。
  4. 数据传输和结果返回:在执行查询操作时,执行器会从磁盘或内存中读取数据,并将结果传输给客户端。它负责处理查询结果的封装和传输,以及处理数据的排序、分页等需求。
  5. 事务管理:执行器还负责事务的管理,包括事务的启动、提交、回滚等操作。它会根据查询操作的需要,自动开始、提交或回滚事务,并确保查询的一致性和隔离性。

MySQL 执行器是 MySQL 查询处理的核心组件之一,负责实际执行查询操作,并将结果返回给客户端。它与优化器、存储引擎等组件协同工作,完成数据库查询的全过程。

本文由 mdnice 多平台发布


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 关系型数据库 MySQL
轻松入门MySQL:优化复杂查询,使用临时表简化数据库查询流程(13)
轻松入门MySQL:优化复杂查询,使用临时表简化数据库查询流程(13)
228 0
|
14天前
|
SQL 存储 缓存
MySQL执行流程
本文介绍了MySQL的执行流程,分为server层和引擎层。server层包含连接器、查询缓存、解析器、预处理器、优化器等组件,负责SQL的接收、解析、优化及执行;引擎层负责数据的存储与读取。文章详细解释了各组件的功能,如连接器负责用户身份认证,查询缓存提高查询效率,解析器进行SQL的词法和语法分析,预处理器验证表和字段的存在性,优化器选择最优执行计划,最终由查询执行引擎完成查询并将结果返回给客户端。
MySQL执行流程
|
1月前
|
存储 SQL NoSQL
|
3月前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
117 7
|
5月前
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
|
6月前
|
关系型数据库 MySQL 数据库
MySQL数据库——函数-字符串函数、数值函数、日期函数、流程函数
MySQL数据库——函数-字符串函数、数值函数、日期函数、流程函数
54 2
|
7月前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
7月前
|
存储 SQL 关系型数据库
【MySQL进阶之路 | 基础篇】流程控制
【MySQL进阶之路 | 基础篇】流程控制
|
6月前
|
开发工具
centos8 yum安装mysql8 流程配置
centos8 yum安装mysql8 流程配置
697 0
|
7月前
|
存储 缓存 关系型数据库
MySQL结构流程,看这一篇就够了!
MySQL结构流程,看这一篇就够了!